c++ - 以 block 的形式读取(文本)文件

标签 c++ io

我目前全神贯注于 C++ 中的 I/O 操作,我遇到了以特定大小(如 1024 字节)的 block 而不是一次读取和/或写入整个文件的数据的方法。现在我对这个概念有几个疑问:

  1. 这样做有什么好处?仅仅是因为一次可以读取多少字节有限制吗?或者这会显着加快速度吗?它可能只用于套接字连接,还是用于预先不知道大小的文件?
  2. 如果这对所有类型的文件都有用(比如包含配置值的文本文件),我该如何正确处理 block ?请参阅下面的示例:

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

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

现在我读到的一个 block 包含这个:

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

所以我的 block 不够大,无法完整存储最后一行。如果我现在将此 block 与我的配置读取器类一起使用,它将检测到此行,但值错误。 我怎样才能确保它得到正确处理? 也许我在这里走的是完全错误的道路,但我希望得到一些澄清。

最佳答案

您假设这是您可以做出的某种选择,但事实并非如此:文件数据总是以 block 的形式读取。唯一的问题是在哪个抽象层将 block 连接成单个输出,供您的业务逻辑使用?它是在您的“用户空间”代码中还是隐藏在标准库函数后面?因此,您的大部分问题都没有实际意义。

不过,如果您可以使用标准库函数隐藏该逻辑,那么它会为您节省一些手持代码。

比较这个:

#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 字节 block 的等价物——逻辑大致相同):

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

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

关于c++ - 以 block 的形式读取(文本)文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22693058/

相关文章:

c++ - RGB 到 LAB 并返回错误

c++ - 对非内联基类函数的内联调用(这到底是什么意思)?

c++ - 结构的搜索 vector

c - 循环文本文件时出现不需要的字符

bash - 具有文件描述符的重复 IO

java - OutputStream 的 flush 方法什么都不做?

c# - 多个 FileSystemWatcher 是个好主意吗?

C++,为什么在结构/类中不需要前向声明

c++ - 如何为索引创建类型

c - 在分隔符处分割文本文件并在c中分隔整数和文本