[Haskell] [Haskell - I/O] Problem with 'readFile'
djsenda at gmail.com
Sun Aug 27 04:43:24 EDT 2006
On 8/27/06, L. J. <djsenda at gmail.com> wrote:
> 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?
I solve the problem, but my method could not be the better
(methodologically speaking). I insert this code inmediately after read
the file (with readFile):
length mates_str `seq` return ()
Is it so bad this code? I think it works so well.
More information about the Haskell