从文件读取或将文件读入缓冲区然后使用缓冲区(在C ++中)?

时间:2011-10-10 01:13:43

标签: c++ inputstream

我正在编写一个解析器,其中,我需要从文件中读取字符。但是我将逐字逐句地阅读文件,如果条件不满意,甚至可能会在中间停止阅读。

因此建议创建文件的ifstream,并且每次都要寻找位置并从那里开始读取,或者我应该将整个文件读入流或缓冲区,然后使用它而不是??

4 个答案:

答案 0 :(得分:1)

如果可以,请使用内存映射文件。

Boost提供跨平台的:http://www.boost.org/doc/libs/1_35_0/libs/iostreams/doc/classes/mapped_file.html

答案 1 :(得分:1)

文件有多大?你做不止一次传球吗?无论您是否将其读入内存缓冲区,读取文件将消耗(文件大小/ BUFSIZ)读取以完成整个过程。逐个字符读取并不重要,因为底层读取仍然一次消耗BUFSIZ字节(除非你采取措施改变这种行为) - 它只是逐个字符地提出它们。

如果您正在阅读并一次性处理它,那么将其读入内存将意味着总是需要(文件大小/ BUFSIZ)读取,其中 - 假设停止的原因是等量分布的 - 阅读它和在线处理将取平均值(文件大小/ BUFSIZ)* 0.5读取,这在大文件上可能是一个实质性的收获。

一个更重要的问题可能是“你正在寻找这个复杂的解决方案?”找出可爱解决方案所花费的时间可能会占据你从寻找比标准更“漂亮但得到角色和流程”解决方案更精彩的东西所获得的任何收益。

答案 2 :(得分:0)

每次寻找位置并且阅读不会是更好的选择,因为它会降低性能, 尝试创建缓冲区,并从中读取更好的主意和更高效的

尝试一直读取缓冲区中的所有文件内容,然后使用缓冲区处理后续输入需求,而不是每次都读取文件,

答案 3 :(得分:0)

在完整的服务操作系统(即Windows,Mac OS,Linux,BSD ......)上,操作系统将有一个缓存机制,可以在一定程度上为您处理此问题(并假设您的使用模式符合“通常”的某些定义“)。

除非您遇到令人无法接受的性能,否则您可能会乐意忽略整个问题(即只使用天真的文件访问原语)。