在 Fortran 中使用填充从文件中读取行

Read line from file with padding in Fortran

如果我有一个文本文件,其中行包含一些非空白字符后跟空格,我如何将这些行读入没有多余空格的字符变量?

character (len=1000) :: text
open (unit=20,file="foo.txt",action="read")
read (20,"(a)") text

将一行的前1000个字符读入可变文本,如果该行少于1000个字符,则在末尾用空格填充。但是,如果行长为 100,则有 900 个无关的空格,并且程序不会“知道”实际读取的行有多长。

Fortran 字符串用空格填充。根本没有机会用恒定长度的 Fortran 字符串区分字符串中任何重要的空白填充。

如果每个空白字符都很重要,我建议将该文件视为流访问文件(根据需要格式化或未格式化),将单个字符读取到某个数组缓冲区并仅在您之后分配一个延迟长度的字符串知道你实际需要的长度。

character (len=1000) :: text
integer :: s, ios

open (unit=20,file="foo.txt",action="read")
read (20,"(a)", size=s, advance='no', iostat=ios) text

在最后一行之后,s 包含读取的字符数,包括尾随空格,我认为这就是您想要的。

备注:

对于 size 标签,您还必须将 advance 标签设置为 'no',否则会出现编译错误。由于格式为 "(a)",整行都被读取,所以下一个 read 语句将前进到下一行,尽管有 'no'。没关系。

ios 在尝试读取超过行尾时存储一个负整数。如果行短于 text 的长度,则总是会发生这种情况。没关系。 当试图读取超过 文件 的末尾时,ios 将存储一个 different 负整数。我认为这两个负整数不是由标准设定的,因此您可能需要进行一些实验。就我而言,使用 gfortran 编译器时,ios 在尝试读取文件末尾时为 -1,否则为 -2。