|
|
1
39
正如其他人所说,这是因为懒惰的评估。此操作后,手柄半关闭,读取所有数据时自动关闭。hGetContents和readFile都是以这种方式延迟的。在句柄保持打开时遇到问题的情况下,通常只需强制读取。以下是简单的方法:
然而,现在,没有人再为文件I/O使用字符串了。新方法是使用Data.ByteString(hackage上提供)和Data.ByteString.Lazy 希望 懒惰的阅读。
ByTestRing是处理大字符串(如文件内容)的方法。它们比字符串([Char])快得多,内存效率也更高。 笔记: 我从Control.Parallel.Strategies导入rnf只是为了方便。你可以很容易地自己写这样的东西:
懒惰的I/O被专家认为是邪恶的;目前,我建议对大多数文件I/O使用严格的bytestring。烤箱中有一些解决方案试图恢复可组合的增量读取,其中最有希望的是Oleg称之为“Iteratee”。 |
|
|
2
4
使现代化 :Prelude.readFile会导致如下所述的问题,但切换到使用数据。ByteString的所有版本都有效:我不再获得异常。]
?!?!? |
|
|
3
2
这是因为hGetContents还没有做任何事情:它是惰性I/O。只有当您使用结果字符串时,文件才被实际读取(或需要的部分)。如果要强制读取,可以计算其长度,并使用seq函数强制计算长度。懒惰的I/O可能很酷,但也可能令人困惑。 有关详细信息,请参阅 the part about lazy I/O 例如,在现实世界中,哈斯克尔。 |
|
|
4
1
哪里
有趣的是,
产量
Making Haskell programs faster and smaller: hGetContents, hClose, readFile |
|
|
5
1
safe-lazy-io . (但是,安全懒惰io不支持bytestring I/O。) |
|
|
6
0
这里的解释相当长。请原谅我只提供了一个小提示:您需要阅读“半封闭文件句柄”和“unsafePerformIO”。 简言之,这种行为是语义清晰和惰性评估之间的设计折衷。您应该推迟hClose,直到您完全确定不会对文件内容执行任何操作(例如,在错误处理程序中调用它或类似的操作),或者使用hGetContents之外的其他方法来非惰性地获取文件内容。 |
|
|
user23819755 · 从文件加载的数据未按正确顺序返回 2 年前 |
|
|
Grekys · C数组元素全部变为相同值 2 年前 |
|
|
Deba · 为什么在cin语句中打印空格时,第0个字符没有打印出来? 2 年前 |
|
|
catodd · C-试图将整数和结构数组存储到二进制文件中 2 年前 |
|
|
heapyams · Java可执行文件无法读取资源文件夹[重复] 2 年前 |
|
|
Community wiki · 在文件中插入值 3 年前 |