1

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であるということです)

私の問題は、ファイルから読み取った文字が行末なのかファイルの終わり(コードの「if」)なのかを確認する方法がわからないことです。このように文字を読んで印刷すると、最終的には元のテキストと同じ場所に改行が入るので、どういうわけか「文字」として読み取って認識していると思います。おそらく、文字を整数に変換し、適切な数と比較しますか?それとももっと直接的な方法がありますか?

(レジスタ読み取り(編集:レコード読み取りを意味します)を使用して、行をより簡単に読み取り、IOステータスを追加してeofをチェックするプログラムを実行できることは知っていますが、「行カウンター」は単なる便利な例です。テキストファイルをより制御された方法で移動する方法を学ぶことです)

4

1 に答える 1

2

行末記号として特定の文字をチェックすると、プログラムは OS に依存します。プログラムがコンパイラと OS に依存するように、言語の機能を使用することをお勧めします。行は基本的にレコードなので、なぜこれをスチーム I/O で行うのですか? その要求は、簡単な仕事を難しい仕事に変えてしまうようです。通常の IO を使用できる場合、テキスト ファイルの行数をカウントするプログラムの例を次に示します。

編集: コード フラグメントは、コメント内の質問に答えるプログラムに変更されました。文字変数として「行」を使用して、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

ファイルをさらに処理したい場合は、巻き戻すことができます。

PS

私が Fortran Stream IO を使用した主な理由は、C などの他の言語で生成されたファイルを読み取るためです。

改行境界を書き込むための移植可能なメソッドが提供されています。そのようなものをテストするための移植可能な方法を知りません。

于 2011-07-16T00:52:28.347 に答える