Fortran:打开文件时奇怪的空格填充字符串行为

时间:2013-04-16 13:13:53

标签: string fortran whitespace

我有一个Fortran程序,它从一堆输入文件中读取数据。第一个文件包含我将读取的其他三个文件的名称,在输入文件中指定(我在执行程序时重定向到stdin),如下所示

"data/file_1.dat" "data/file2.dat" "data/file_number_3.txt"

它们被常规空格分隔,并且线上没有尾随空格,只是一个换行符。我读了这样的文件名:

character*30 fnames(3)
read *, fnames

然后我继续读取数据,通过调用一个以文件名作为参数的函数:

subroutine read_from_data_file(fname)
    implicit none
    character*(*) fname

    open(15,file=fname)
    ! read some data
end subroutine read_from_data_file

! in the main program:
do i=1,3
    call read_from_data_file(trim(fnames(i)))
end do

对于第三个文件,无论我将文件名放在输入文件中的顺序,填充都不起作用,Fortran尝试使用“data / file_number_3”之类的名称打开a .txt“,即带有一堆尾随空格。这会在我的文件夹中创建一个名为data/file_number_3.txt (White Space Conflict)的空文件,一旦我尝试从文件中读取,程序就会因EOF错误而崩溃。

我尝试在各个地方添加trim(),例如open(15,file=trim(fname))没有任何成功。我假设它与Fortran中字符数组的修复长度有关,但我认为trim()会处理这个问题 - 这个假设是不正确的吗?

如何解决并解决此问题?

1 个答案:

答案 0 :(得分:1)

嗯。我想知道输入文件的最后一行是否有最后一个字符,而不是空格,例如在Windows系统上弹出的Linux系统中的EOF标记或反之亦然。如果您在Linux机器上,请尝试dos2unix;在Windows机器上尝试别的东西(我不确定是什么)。

如果这不起作用,请尝试使用内在的IACHAR函数检查行为不当的字符串中的每个字符并检查内脏。

和你一样,我希望trim可以修剪字符串中的尾随空格,但不是所有未显示的字符都被视为空格。

而且,在我写作的时候,你使用了诸如

之类的声明
character*30

过时了,现代的替代方案是

character(len=30)

character(len=*)

优先于

character*(*)

修改

您是否尝试过从文件中读取这些名称并从stdin读取它们?