Reputation: 10324
I'm trying to read a file line by line, but I don't know how to stop when I reach the EOF.
I have this code:
readWholeFile = do inputFile <- openFile "example.txt" ReadMode
readALine inputFile
readALine x = do y <- hGetLine x
print y
readALine x
and it obviously always terminata raising an exception.
How can I solve?
Edit: exact error message is:
*** Exception: example.txt: hGetLine: end of file
Upvotes: 8
Views: 11269
Reputation: 10561
One more solution. You can lazy read file with readFile
, lazy split it on-demand and take result line by line:
readLines :: FilePath -> IO [String]
readLines = fmap lines . readFile
Upvotes: 20
Reputation: 2697
You can test the handle x with hIsEOF
before reading further. hGetLine fails when the end of file is encountered when reading the first character of the line
Upvotes: 4
Reputation: 95348
You can use hIsEOF
to check the EOF status manually before reading a line, or you can just use the readily available (lazy) readFile
function.
Upvotes: 8
Reputation: 1458
What you are looking for is, hIsEOF
Check out http://book.realworldhaskell.org/read/io.html
Upvotes: 10