我有一个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()
会处理这个问题 - 这个假设是不正确的吗?
如何解决并解决此问题?
答案 0 :(得分:1)
嗯。我想知道输入文件的最后一行是否有最后一个字符,而不是空格,例如在Windows系统上弹出的Linux系统中的EOF标记或反之亦然。如果您在Linux机器上,请尝试dos2unix
;在Windows机器上尝试别的东西(我不确定是什么)。
如果这不起作用,请尝试使用内在的IACHAR
函数检查行为不当的字符串中的每个字符并检查内脏。
和你一样,我希望trim
可以修剪字符串中的尾随空格,但不是所有未显示的字符都被视为空格。
而且,在我写作的时候,你使用了诸如
之类的声明character*30
过时了,现代的替代方案是
character(len=30)
和
character(len=*)
优先于
character*(*)
修改强>
您是否尝试过从文件中读取这些名称并从stdin
读取它们?