2012-03-28 62 views
1

我已经在Haskell中编写了一个Brainfuck解释器,但是只有当我按Ctrl-D发送EOF信号时才会对输入进行操作。如何让程序在键入时对每个字符执行操作?如何在Haskell中输入时如何获得输入?

Here是来源。要使用该程序,请给文件解释为参数或在标准输入的第一行中键入您的程序。

回答

3

这听起来像你的输入被缓冲。您可以用System.IO.hSetBuffering修改文件句柄的缓冲模式。如果你是从标准输入读取,例如,那么你可以禁用与缓冲:

import System.IO 

hSetBuffering stdin NoBuffering 
+0

我试过了,但它仍然等待,直到我在对输入作出响应之前按Ctrl-D。 – dlahoti 2012-03-28 21:55:31

+1

我将'stdout'的缓冲模式改为'NoBuffering',并解决了这个问题。 – dlahoti 2012-03-28 22:01:15

1

getLine等待输入换行符(\n),因为如果用户键入了一串字符但从未按下回车键?那么如果一些“行”已经被处理,那么这将是一个错误,如果该“行”毕竟不是行。

您应该使用getContents来代替它,它将返回在终端输入的所有内容。

此外,您使用的是以下行:

then hGetContents =<< openFile (head args) ReadMode 

这将打开一个文件,从来没有关闭它。这是罚款的短节目,但它可能是未来的一个更好的主意来习惯这样做:

then readFile $ head args 
+0

问题不与'getLine'在于开头,而是以接近尾声了'getChar'(在'exec'函数中)。 – dlahoti 2012-03-28 21:56:08