Help with Exceptions on I/O

Brandon Michael Moore brandon@its.caltech.edu
Tue, 12 Aug 2003 17:05:07 -0700 (PDT)


You don't really need to change the buffering mode. stdout is line
buffered by default, so you just need to make sure a newline is printed
after your message. putStrLn adds a newline after the string it prints, or
you could use \n in the string literal. Try this:

 main = do
  --lots of code goes here,
  --with a catch handler if you want it
  putStrLn "Press ENTER to exit" -- with Ln
  getLine
  return ()

On Tue, 12 Aug 2003, Hal Daume wrote:

> you can write this a bit more simply as:
>
> main = do
>   (do do-the-major stuff here
>       putStr "File created...")
>     `catch` (\_ -> show the error)
>   getLine    -- look ma, no <-
>   return ()
>
> now, your problem is almost certainly with buffering.  in the main do,
> put
>
>   hSetBuffering stdout NoBuffering
>   hSetBuffering stdin  NoBuffering
>
> you'll need to import System.IO to get these.
>
>  --
>  Hal Daume III                                   | hdaume@isi.edu
>  "Arrest this man, he talks in maths."           | www.isi.edu/~hdaume
>
> -----Original Message-----
> From: haskell-cafe-admin@haskell.org
> [mailto:haskell-cafe-admin@haskell.org] On Behalf Of Alexandre Weffort
> Thenorio
> Sent: Tuesday, August 12, 2003 4:17 PM
> To: haskell@haskell.org
> Cc: haskell-cafe@haskell.org
> Subject: Help with Exceptions on I/O
>
>
> I have a program which creates textfiles out of other files. Since the
> program is runned from windows I output some text strings (Like "File
> created succefully") and I need to stop the program before it quits so
> that
> the user can read the line outputted to know what went on and then he
> can
> press ENTER to quit the program.
>
> I managed to do this fine if no error occurs but when a error occurs I
> am
> having problems.
>
> The code goes like that
>
> main :: IO()
> main =catch (do
>                      Do all the needed stuff here
>                      putStr "File created Successfully. Press RETURN to
> quit"
>                      dummy <- getLine --Halts the program so the user
> can
> read the above line)
>                      putStr "Exiting now..." --needed since I can't
> finish a
> do function with the "dummy<- getLine" line) (\_ -> do putStr "\nFile
> not
> found. Press RETURN (ENTER) to quit."
>      dumb <- getLine
>      putStr "\nExiting...")
>
> So when the program runs, if the input file is found the program writes
> successfull creation of file but if the file doesn't exist, after the
> user
> gives the input filename and press enter, the program creates a new line
> and
> Halts (Probably because of the getLine function) without writing out
> anything, then when the user press ENTER again it writes the line at the
> first putStr (File not...), then writes the next putStr line under it
> (Exiting...) and exits. I don't know why it doesn't wirte the first
> line,
> halts and then when user press enter it writes the second and quits.
>
> Can anybody help me as I am not very familiar with exception and
> catches.
>
>
> Another question I have is: Is there any other function rather than
> getLine
> that halts a program and continues when a user press any key (Instead of
> ENTER) and besides this is an ugly code since getLine wasn't made for
> that
> but I couldn't find anything else myself.
>
> Thank you in advance.
>
> Best Regards
>
> Alex
> _______________________________________________
> Haskell mailing list
> Haskell@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell
>
>
>