【问题标题】:Prompt message disappears in compiled executable?提示消息在已编译的可执行文件中消失?
【发布时间】:2012-03-08 19:50:32
【问题描述】:

我有一个 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 解释器上运行它时,提示显示正常,我可以输入我的输入(其他一切正常)。

例如 *主要>主要 请输入程序源文件名:sum.urm 请输入初始文件配置文件名:sum.conf 9

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

例如

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

任何想法为什么会发生这种情况?

出于好奇,我在 Haskell 中实现了 Unlimited Register Machine

【问题讨论】:

    标签: haskell


    【解决方案1】:

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

    【讨论】:

    • 另请注意,GHCi 将 stdin 和 stdout 设置为无缓冲,这就是您在那里获得预期行为的原因。
    • 另一个可能更简单的解决方案是使用hSetBuffering stdout NoBuffering。然后putStr 会做预期的事情。
    • 谢谢。我不得不做hFlush stdout 而不是hFlush stdio,但它给了我这个想法。
    • 哦,对不起,这是一个错字。当然应该是stdout
    【解决方案2】:

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

    Why isn't my IO executed in order?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-20
      • 2011-05-01
      相关资源
      最近更新 更多