2

一連の入力ファイルからデータを読み取る Fortran プログラムがあります。stdin最初のファイルには、次のように、入力ファイル (プログラムの実行時にリダイレクトするファイル) で指定された、読み込む他の 3 つのファイルの名前が含まれています。

"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

3 番目のファイルの場合、入力ファイルにファイル名を入れる順序に関係なく、パディングは機能せず、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 に答える