Default bufferring behavior

Simon Marlow simonmarhaskell at gmail.com
Wed Aug 23 06:43:57 EDT 2006


Vyacheslav Akhmechet wrote:
> I encountered the following issue last night. Writing a program like this:
> 
> main = do putStr "> "
>                   x <- getLine
>                   putStr x
> 
> behaves as expected in hugs and ghci (first prints "> ", then waits
> for input, then prints the input). However, when compiling and running
> an executable via ghc, the behavior was very different. I saw a blank
> console screen and when I typed something it was echoed back to me (as
> in "> 25") only after I hit enter. This is trivially fixed by
> flushing:
> 
> main = do putStr "> "
>                   hFlush stdout
>                   x <- getLine
>                   putStr x
> 
> or by turning off buffering. Is this the intended behavior?

Yes, it's the intended behaviour.

> This
> problem does not appear when using putStrLn (as it flushes
> automatically) and is quite distracting to newbies. To me it looks
> like this behavior is at odds with something one can reasonably expect
> and bufferring should be turned off by default. What do you guys
> think?

We did at one time have some code that flushed stdout before reading from stdin, 
but I wasn't too keen on the idea so I didn't implement that idea in the current 
version of the IO library.

Personally I think the current behaviour is ok, despite the fact that it does 
trip people up occasionally.  If you think about it, it's consistent: stdout is 
line bufferred, so it doesn't get flushed until you output a \n.

Cheers,
	Simon


More information about the Glasgow-haskell-users mailing list