[Haskell-beginners] Runtime error while feeding a binary to stdin
Manuel Vázquez Acosta
mva.led at gmail.com
Tue Jan 10 22:46:23 UTC 2017
Hi all,
I'm quite new to Haskell. While following the "Real World Haskell" and
doing some experimentation I came up with a anoying situation:
Trying to read data from stdin it seems that binary data is not
allowed. A simple "copy" program:
-- file: copy.hs
import System.IO
main = do
input <- hGetContents stdin
hPutStr input
Fails when I run it like:
$ ghc copy.hs
$ ./copy < input > output
copy: <stdin>: hGetContents: invalid argument (invalid byte sequence)
input contains binary data. In fact of all the following programs only
the first works with binary data:
copy:: IO ()
copy = do
bracket (openBinaryFile "input" ReadMode) hClose $ \hi -> do
bracket (openBinaryFile "ouput" WriteMode) hClose $ \ho -> do
input <- hGetContents hi
hPutStr ho input
copy2:: IO ()
copy2 = do
-- Doesn't work with binary files
source <- readFile "input"
writeFile "output" source
copy3:: IO ()
copy3 = do
-- Doesn't work with binary files either
interact (map $ \x -> x)
copy4:: IO ()
copy4 = do
input <- hGetContents stdin
hPutStr stdout input
But I lost any chance of piping and/or using '<', '>' in the shell.
Best regards,
Manuel.
More information about the Beginners
mailing list