2012-10-03 2 views
0

Я новичок в Fortran и пытаюсь перепрофилировать немного кода, который является частью более крупной программы, которую я унаследовал. Когда программа запускается, она запрашивает имена выходных файлов. Я бы предпочел указать эти имена выходных файлов непосредственно в коде, поэтому я могу запускать программу параллельно/все сразу (время выполнения программы составляет около 15 часов и должно быть запущено для 66 разных файлов, поэтому я предпочли бы запускать их всех сразу, а не один за другим, потому что это займет довольно много времени).Новый выходной файл Fortran

бит кода я работаю с выглядит следующим образом:

24 print *,'Enter output filename' 
25 read(*,*) fout 
26 print *,'Enter parameter estimate output filename' 
27 read(*,*) foutb 
28 print *,'Enter seed for random number generator' 
29 read(*,*) idum 
30 if(idum.gt.0) idum = -idum 

Все, что я пытался дает мне:

At line 25 of file v1.f95: 
Fortran runtime error: End of file 

Я проверил, что у меня есть правильные концы строк. Любые предложения?

+0

Эта ошибка, вероятно, исходит из других источников - из кода, который пытается прочитать больше из файла, чем может дать файл. Что вы на самом деле пытались? У вас есть компьютер с 66 ядрами выполнения? Если нет, попытка запустить 66 программ в одно и то же время может не дать вам ускорение, которое вы ожидаете. – IanH

+0

Причина, по которой я (думаю, я) знаю ошибку, приходит из этой части кода, потому что она говорит 'В строке 25 файла v1.f95' непосредственно перед кодом ошибки, и эта часть кода начинается в строке 24. У меня есть доступ к кластеру компьютеров с достаточным количеством узлов, поэтому я хотел бы заставить это работать. Я попытался удалить строки 'print' и пробовал различные способы перенаправления прочитанных файлов так:' read (*, '(file.out)') fout' Ошибка всегда одна и та же, что заставляет меня думать Я просто пропустил что-то с синтаксисом того, как указать выходной файл. – mfk534

+0

Я также пытался включить 'status = new' как часть команды чтения, но это не сработало. – mfk534

ответ

3

Если я правильно понял вопрос, вы хотите передать количество исполняемых файлов/других переменных в свою программу во время выполнения. Это можно было бы использовать с помощью простого входного файла namelist и передачи этого одного файла в программу. Код будет выглядеть, например:

character(20) :: file1, file2, file3 
integer :: idum 
namelist /input/ file1, file2, file3, idum 

read(unit = iunit, nml = input) 

где iunit является блок ввода/вывода подключается к ранее открытому входному файлу. Содержимое этого файла будет выглядеть следующим образом:

&input     ! Name of corresponding namelist group 
    file1 = 'file1.out', 
    file2 = 'file2.out', 
    file3 = 'file3.out', 
    idum = 1 
/

Файлы в стиле Namelist очень просты в обращении. Они не заботятся о порядке записей, длине записи или комментариях. Вы можете опустить какие-либо переменные в файле namelist (их значение не будет изменено) или включить несколько элементов (одно и то же имя) в одном файле.

0

возможно наиболее простое решение для Вас, предполагая у вас есть только несколько простого чтения (*, *) 's вы можете оставить код в покое и просто труба необходимых строки для стандартного ввода

echo "file1\nfile2\n3" | executable 

(протестировано под CSH .. вы, возможно, потребуется настроить немного для другой оболочки)

сообщение об ошибке BTW заставляет меня думать, что вы уже чтения из стандартного ввода трубы , а не терминал, а некоторые ранее прочитанным исчерпаны вход.

0

Я думаю, что ваша ошибка возникает из-за того, что fout не может быть прочитан без символьной строки в качестве спецификатора формата. Попробуйте это на линии 25 (и в других Риде)

read(*,'(a)') fout

Вы могли бы улучшить, что если вы копируете длину из определения FOUT, как и (угадывания размера)

CHARACTER fout(25) . . . read(*,'(a25)') fout

Вы читаете со стандартного ввода (это звездочка в первом аргументе). Я предполагаю, что ваш входной файл является ASCII-текстом. Как и сейчас, вы можете указать имена выходных файлов в первых двух строках файла, затем третью строку для idum, затем остальную часть ввода (если она есть).

Произнесите исполняемый my_program.exe и ваш входной файл (с тремя линиями, упомянутых выше) является my_input_file.txt, вы можете перенаправить входной файл для стандартного ввода, как это

%> my_program.exe < my_input_file.txt

Смежные вопросы