我想使用FORTRAN流式I / O来创建一个程序,告诉我文本文件有多少行。我的想法是做这样的事情:
OPEN(UNIT=10,ACCESS='STREAM',FILE='testfile.txt')
nLines=0
bContinue=.TRUE.
DO WHILE (bContinue)
READ(UNIT=10) cCharacter
IF (cCharacter.EQ.{EOL-char}) nLines=nLines+1
IF (cCharacter.EQ.{EOF-char}) bContinue=.FALSE.
ENDDO
(我没有包含变量声明,但我认为你了解它们是什么;唯一重要的澄清是cCharacter有LEN = 1)
我的问题是我不知道如何检查我刚刚从文件中读取的字符是行尾还是文件结尾(代码中的“ifs”)。当你以这种方式阅读和打印字符时,你最终会在原始文本中的相同位置获得换行符,所以我认为它确实读取并将它们识别为“字符”,不知何故。也许将字符转换为整数并与适当的数字进行比较?或者有更直接的方式吗?
(我知道你可以使用寄存器读取(EDIT:我的意思是记录读取)来做一个更容易读取行的程序并添加IOstatus来检查eof,但“行计数器”只是一个有用的例子,我们的想法是学习如何通过文本文件以更加可控的方式移动
答案 0 :(得分:2)
检查特定字符作为行终止符会使您依赖于程序操作系统。最好使用该语言的功能,以便您的程序依赖于编译器和操作系统。由于线路基本上是记录,为什么使用蒸汽I / O?这个要求似乎很容易成为一个艰难的工作。如果可以使用常规IO,这里有一个示例程序来计算文本文件中的行。
编辑:代码片段已更改为程序以回答评论中的问题。使用“line”作为字符变量,当我用gfortran和ifort测试程序时,当输入文件有空行或空行时我没有看到问题。
program test_lc
use, intrinsic :: iso_fortran_env
integer :: LineCount, Read_Code
character (len=200) :: line
open (unit=51, file="temp.txt", status="old", access='sequential', form='formatted', action='read' )
LineCount = 0
ReadLoop: do
read (51, '(A)', iostat=Read_Code) line
if ( Read_Code /= 0 ) then
if ( Read_Code == iostat_end ) then
exit ReadLoop ! end of file --> line count found
else
write ( *, '( / "read error: ", I0 )' ) Read_Code
stop
end if
end if
LineCount = LineCount + 1
write (*, '( I0, ": ''", A, "''" )' ) LineCount, trim (line)
if ( len_trim (line) == 0 ) write (*, '("The above is an empty or all blank line.")' )
end do ReadLoop
write (*, *) "found", LineCount, " lines"
end program test_lc
如果您想进一步处理该文件,可以回退它。
P.S。
我使用Fortran Stream IO的主要原因是读取其他语言生成的文件,例如C
提供便携式方法来编写新线边界;我不知道有一种可移植的方法来测试这种方法。