为什么Haskell NoBuffering选项似乎仍然缓冲?

时间:2016-06-05 16:44:24

标签: haskell ghci

我在ghci中加载了一个文件,其中包含以下内容:

h <- openFile "somefile.txt" ReadMode
hSetBuffering h NoBuffering

然后我在文本编辑器中修改并保存了somefile.txt。当我在ghci中多次调用hGetChar时,我会收到该文件的旧字符(就像我打开它时整个文件被缓冲一样)。我希望调用hGetChar来返回修改后的内容。为什么不是这样?

修改 在上述情况下没有显示修改内容的原因确实是因为文本编辑器。当使用cat命令( cat&gt; somefile.txt )时,将返回修改后的文件内容。

然而,它似乎仍然在做缓冲。说文件内容如下:

ABCDEFGHI
123456789

如果我运行hGetChar,我会按预期得到'A'。

现在,如果我使用cat( cat&gt; somefile.txt )将内容更改为以下内容,并再次运行hGetChar,我会期待'Z'但它返回'B':< / p>

AZZZZZZZZ

1 个答案:

答案 0 :(得分:1)

BufferMode仅在写入句柄时有用,而不是在读取时。

来自GHC.IO.Handle.Types中的[note Buffered Reading]

Note that the buffering mode (haBufferMode) makes no difference when
reading data into a Handle.  When reading, we can always just read all
the data there is available without blocking, decode it into the Char
buffer, and then provide it immediately to the caller.

输入BufferMode的文档似乎已过时。