2

我有一个从一堆输入文件中读取数据的 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.txt”之类的名称打开一个,即带有一堆尾随空格。这会在我的文件夹中创建一个名为的空文件data/file_number_3.txt (White Space Conflict),一旦我尝试从该文件中读取,程序就会因 EOF 错误而崩溃。

我试过trim()在不同的地方添加,例如open(15,file=trim(fname))没有任何成功。我认为这与 Fortran 中字符数组的固定长度有关,但我认为trim()会解决这个问题 - 这个假设不正确吗?

我该如何解决和解决这个问题?

4

1 回答 1

1

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

如果这不起作用,请尝试使用内部IACHAR函数来检查行为异常的字符串中的每个单独的字符并检查内脏。

像您一样,我希望trim从字符串中修剪尾随空格,但并非所有未显示的字符都被视为空格。

而且,在我写作的时候,你对声明的使用,比如

character*30

已经过时了,现代的替代品是

character(len=30)

character(len=*)

优先于

character*(*)

编辑

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

于 2013-04-16T13:19:52.277 回答