8

ファイルを 1 行ずつ読み取ろうとしていますが、EOF に達したときに停止する方法がわかりません。

私はこのコードを持っています:

readWholeFile = do inputFile <- openFile "example.txt" ReadMode
                readALine inputFile

readALine x = do y <- hGetLine x
                 print y
                 readALine x

そして、それは明らかに常に終了し、例外が発生します。

どうすれば解決できますか?

編集:正確なエラーメッセージは次のとおりです。

*** Exception: example.txt: hGetLine: end of file
4

4 に答える 4

19

もう1つの解決策。を使用してファイルを遅延読み取りしreadFile、オンデマンドで遅延分割し、結果を行ごとに取得できます。

readLines :: FilePath -> IO [String]
readLines = fmap lines . readFile
于 2012-09-05T19:32:52.167 に答える
8

を使用hIsEOFして、行を読み取る前に EOF ステータスを手動で確認するか、すぐに利用できる (遅延)readFile関数を使用することができます。

于 2012-09-05T19:30:08.520 に答える
8

あなたが探しているのは、hsEOF

http://book.realworldhaskell.org/read/io.htmlをご覧ください

于 2012-09-05T19:29:22.297 に答える
4

hIsEOFさらに読む前に、ハンドル x をテストできます。行の最初の文字を読み取るときにファイルの終わりが検出されると、hGetLine が失敗します。

于 2012-09-05T19:30:20.830 に答える