在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将存储一个不同的负整数。这两个负整数是什么,我认为不是由标准确定的,所以你可能需要做一些实验。在我的例子中,使用gfortran编译器,当试图读取超过文件末尾时,ios为-1,否则为-2。

最新更新