2016-03-12 1 views
1

Мне нужна помощь о неявном цикле do в Fortran. Это мой простой код:Запись в файл с использованием неявного цикла do

Program Simple 

Implicit none 

Integer::i,j 
Integer,parameter::N=2,M=3 
Real,dimension(N,M)::Pot 

Open(1,File='First.txt',Status='old') 

    Read(1,'(M(f3.1,1x))') ((Pot(i,j),j=1,M),i=1,N) 

Close(1) 

Open(2,File='Second.txt',Status='Unknown') 

    Write(2,'(M(i0,1x,i0,1x,f3.1,1x))') ((i,j,Pot(i,j),j=1,M),i=1,N) 

Close(2) 

Stop 
End program Simple 

Это файл First.txt:

1.1 1.2 1.3 
2.1 2.2 2.3 

Когда я пытаюсь выполнить эту программу, я получил это сообщение:

Unexpected element 'N' in format string 
Unexpected element 'M' in format string 

Я хочу сохраните имя целочисленных переменных N и M в записи. Есть ли способ сохранить свои значения из части декларации?

ответ

1

Вы используете M и N в строке (как символы), а не как переменные. Для того, чтобы использовать переменные, необходимые для написания их значения в строке формата:

character(len=128) :: fmtString 
!... 
write(fmtString,*) M 
fmtString = '('//trim(adjustl(fmtString))//'(f3.1,1x))' 
Read(1,fmtString) ((Pot(i,j),j=1,M),i=1,N) 

И точно так же для write заявления.

Тем не менее, вы можете использовать вход для ввода списка (Read(1,*)) для ввода, и Fortran определит точный формат.

Вместо этих манипуляций с строкой вы можете использовать (*(f3.1,1x)) в современных компиляторах, или если у вас есть старый, просто укажите очень большое число, например. (99999(f3.1,1x)). В обоих случаях будет напечатано правильное количество значений. Однако это приведет к записи всех значений m*n в одной строке [спасибо @agentp за указание этого].

+1

в этом случае просто используя * будет помещать все значения 'm * n' в одну строку, я думаю – agentp

+0

Это помогает! Правильная форма находится в отредактированном вопросе. –

+0

@JohnCorn пожалуйста не делаем этого. Если вы отредактируете свой вопрос таким образом, никто больше его не поймет. –

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