gpt4 book ai didi

file-io - Fortran 读取语句读取超出行尾的内容

转载 作者:行者123 更新时间:2023-12-02 02:05:47 26 4
gpt4 key购买 nike

您知道 Fortran 90/95/2003 标准之一是否保证以下陈述为真?“假设字符变量的读取语句被赋予一个空行(即仅包含空格和换行符)。如果格式说明符是星号(*),它将继续读取后续行,直到出现非空行为止。找到行。如果格式说明符是“(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”中,而不继续到第四行。

我尝试使用 Intel Fortran (ifort 12.0.4) 和 GNU Fortran (gfortran 4.5.0) 编译程序,得到了相同的结果。

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

感谢您的帮助。

最佳答案

来自 Fortran 2008 标准草案:

List-directed input/output allows data editing according to the type of the list item instead of by a format specification. It also allows data to be free-field, that is, separated by commas (or semicolons) or blanks.

然后:

The characters in one or more list-directed records constitute a sequence of values and value separators. The end of a record has the same effect as a blank character, unless it is within a character constant. Any sequence of two or more consecutive blanks is treated as a single blank, unless it is within a character constant.

这隐含地表明,在列表定向输入中,空行被视为空白,直到下一个非空值为止。

读取时使用fmt='(A)'格式描述符时,空行被读入str。另一方面,fmt=*(表示自由格式的列表定向 I/O)会跳过空白行,直到找到非空白字符串。要测试这一点,请执行以下操作:

PROGRAM chk_read
INTEGER :: cnt
INTEGER, PARAMETER :: MAXLEN=30
CHARACTER(len=MAXLEN) :: str

cnt=1
do
read(*,fmt='(A)',end=100)str
write(*,'(I1,3A)')cnt,' str_start|', str, '|str_end'
cnt=cnt+1
enddo
100 continue

END PROGRAM chk_read

$ cat input.dat



yamanakako

kawaguchiko

文件结束

运行程序给出以下输出:

$ a.out < input.dat 
1 str_start| |str_end
2 str_start| |str_end
3 str_start| |str_end
4 str_start|yamanakako |str_end
5 str_start| |str_end
6 str_start|kawaguchiko |str_end

另一方面,如果您使用默认输入:

read(*,fmt=*,end=100)str

您最终会得到以下输出:

$ a.out < input.dat 
1 str1_start|yamanakako |str1_end
2 str2_start|kawaguchiko |str2_end

关于file-io - Fortran 读取语句读取超出行尾的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8296058/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com