提示消息在已编译的可执行文件中消失?

时间:2012-03-08 19:50:32

标签: haskell

我有一个显示提示的Haskell程序,然后从命令行接受输入。我这样做是:

main = do putStr "Please enter program source file name: "
          programFileName <- getLine
          programFileHandle <- openFile programFileName ReadMode
          program <- hGetContents programFileHandle
          putStr "Please enter initial file configuration file name: "
          initConfigFileName <- getLine
          initConfigFileHandle <- openFile initConfigFileName ReadMode
          initConfigStr <- hGetContents initConfigFileHandle
          print (evaluateProgram (lines program) (readReg initConfigStr))

当我在GHCi解释器上运行时,提示显示正常,我可以输入我的输入(以及其他所有工作)。

e.g。     *主&GT;主要     请输入程序源文件名:sum.urm     请输入初始文件配置文件名:sum.conf     9

当我编译它时(在Mac OS X或Windows上),它会生成一个不显示我的提示的可执行文件。它等待两个输入字符串,然后一旦我输入有效的文件名,它就会打印提示和结果。

e.g。

$ ./a.out 
sum.urm
sum.conf
Please enter program source file name: Please enter initial file configuration file name: 9

为什么会发生这种情况?

好奇的是,我在Haskell中实现了Unlimited Register Machine

2 个答案:

答案 0 :(得分:5)

默认情况下,标准输出流stdout是行缓冲的。这意味着它只会在每次输出\n字符时写入控制台,或者最终在程序终止时写入控制台。您可以通过导入System.IO并在结尾处不包含hFlush stdout的每个putStr之后执行\n来解决此问题。

答案 1 :(得分:0)

这是一个缓冲问题。以下是相关问题,有多种解决方案可供选择:

Why isn't my IO executed in order?

Execution order with (>>=) not what I expected