Aslan986
Aslan986

Reputation: 10324

Read a file line by line

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

Answers (4)

Fedor Gogolev
Fedor Gogolev

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

Phyx
Phyx

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

Niklas B.
Niklas B.

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

verheesj
verheesj

Reputation: 1458

What you are looking for is, hIsEOF

Check out http://book.realworldhaskell.org/read/io.html

Upvotes: 10

Related Questions