逐块读取(文本)文件

普埃洛

我目前全都从事c ++的I / O操作,遇到了一种以一定大小(例如1024Bytes)的块而不是一次整个文件读取和/或写入数据的方法。现在,我对这个概念有一些疑问:

  1. 这有什么好处?仅仅是因为一次读取的字节数有限制吗?还是可以大大提高速度?它可能仅用于套接字连接,还是用于预先不知道大小的文件?
  2. 如果这对于所有类型的文件类型(例如其中包含配置值的文本文件)都有用,那么如何正确处理块?请参阅下面的示例:

想象一个配置文件,其结构如下:

[Engine]
bloom = true
AA = 16
[Keys]
jump = SPACE
quit = ESCAPE

现在,我阅读的一个代码块包含以下内容:

[Engine]
bloom = true
AA = 16
[Keys]
jump = SP

因此,我的块不足以完全存储最后一行。如果现在在配置读取器类中使用此块,它将检测到该行,但值错误。如何确保正确处理?也许我在这里走的是完全错误的道路,但我希望您澄清一下。

轨道轻赛

您认为这是您可以选择的一种选择,但事实并非如此:文件数据始终按块读取。唯一的问题是,这些块在哪一层的抽象层连接到一个输出中,以供您的业务逻辑使用?是在您的“用户空间”代码中还是隐藏在标准库函数的后面?因此,您的大部分问题都没有定论。

但是,如果您可以通过使用标准库函数使该逻辑隐藏起来,则可以节省一些手持代码。

比较一下:

#include <string>
#include <fstream>

std::string readFromStream(std::istream& is)
{
   std::string result;

   char x;
   while (is.get(x))
      str += x;

   return result;
}

std::ifstream t("file.txt");
std::string str = readFromStream(t);

(或读取1024个字节的块的等效文件-逻辑将基本相同),其方法如下:

#include <string>
#include <fstream>
#include <streambuf>

std::ifstream t("file.txt");
std::string str((std::istreambuf_iterator<char>(t)),
                 std::istreambuf_iterator<char>());

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章