[Haskell] [Haskell - I/O] Problem with 'readFile'

L. J. djsenda at gmail.com
Sun Aug 27 04:35:23 EDT 2006


On 8/27/06, John Hughes <rjmh at cs.chalmers.se> wrote:
>
>
> > Hi, I use the operation 'readFile' for obtain information locates on
> > a file. When I try to write another information on the same file, I
> > obtain this error message: "openFile: permision denied". I found this:
> > "The readFile operation holds a semi-closed handle on the file until
> > the entire contents of the file have been consumed. It follows that an
> > attempt to write to a file (using writeFile, for example) that was
> > earlier opened by readFile will usually result in failure with
> > isAlreadyInUseError." in this web
> > http://www.haskell.org/onlinereport/io.html.
> >
> > How can I break that semi-closed handle for to write in the
> > preaviously readed file? Thank you.
>
> readFile returns an *unevaluated* list of characters from the file--as your
> program needs those characters, so they will be read from the file. Once
> they have all been read, then the file is closed.  So to ensure that the
> file is closed, you just have to make sure your program reads all the
> characters. One way is to count them. So here's a function that reads a
> file, then rewrites it with "hello" added at the beginning:
>
> addHello f = do
>   s <- readFile f
>   length s `seq` writeFile f ("hello"++s)
>
> length s counts the characters in the file (forcing it all to be read), and
> the `seq` is like a semicolon in C: it forces length s to be computed before
> the writeFile is performed.
>
> John

 Thanks you for your code. I try with it and it works well, but I can
not use it in my aplication because I read the file in one function, I
compute the results with the readed information and, finally, I wrote
this results in another function (in this moment I do not have the
readed string, I have my structured data). How can I use this `seq`
with different functions?


More information about the Haskell mailing list