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
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
What you are looking for is, hIsEOF
Check out http://book.realworldhaskell.org/read/io.html
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With