Fortran读取语句超出了行尾

时间:2011-11-28 12:51:01

标签: file-io io standards fortran

您是否知道以下声明是否可以通过fortran 90/95/2003标准之一保证为真? “假设一个字符变量的read语句被赋予一个空行(即只包含空格和换行符号)。如果格式说明符是星号(*),它继续读取后续行,直到非空白如果格式说明符为'(A)',则将空格字符串替换为字符变量。“

例如,请查看以下最小程序和输入文件。

程序代码:

PROGRAM chk_read
  INTEGER,         PARAMETER :: MAXLEN=30
  CHARACTER(len=MAXLEN)      :: str1, str2

  str1='minomonta'
  read(*,*)     str1
  write(*,'(3A)')  'str1_start|', str1, '|str1_end'

  str2='minomonta'
  read(*,'(A)') str2
  write(*,'(3A)')  'str2_start|', str2, '|str2_end'

END PROGRAM chk_read

输入文件:

----'input.dat' content is below this line----

yamanakako

kawaguchiko    
----'input.dat' content is above this line----

请注意'input.dat'中有四行,第一行和第三行是空白的(仅包含空格和换行符)。如果我以

运行程序
$ ../chk_read < input.dat > output.dat 

我得到以下输出

----'output.dat' content is below this line----
str1_start|yamanakako                    |str1_end
str2_start|                              |str2_end
----'output.dat' content is above this line----

变量'str1'的第一个读语句似乎是查看'input.dat'的第一行,找到一个空行,移到第二行,找到字符值'yamanakako',然后存储它在'str1'。

相比之下,变量'str2'的第二个读取语句似乎是第三行,它是空白的,并将空白行存储在'str2'中,而不是移到第四行。

我尝试通过英特尔Fortran(ifort 12.0.4)和GNU Fortran(gfortran 4.5.0)编译程序并得到相同的结果。

关于提问这个问题的背景:我正在编写一个子程序来读取一个使用空行作为数据块分隔符的数据文件。我想确保在读取数据时丢弃空白行,只留下空白行。我还需要使其符合标准且便携。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

F2008标准草案的这部分内容可能会解决您的问题:

  

10.10.3列表导向输入

     

7当下一个有效项目是字符类型时,输入表格   由零或更多的可能分隔的序列组成   rep-char的类型参数由类型隐含   有效的项目。字符序列可以从结尾处继续   一条记录到下一条记录的开头,但记录结束   在一个加倍的撇号之间不应该出现   撇号分隔的字符序列,也不是双引号   在引号分隔的字符序列中。记录结束了   不要让空白或任何其他角色成为其中的一部分   字符序列。字符序列可以继续进行   根据需要记录。字符为空白,逗号,分号和斜杠   可能出现在默认,ASCII或ISO 10646字符序列中。