gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:23:22 28 4
gpt4 key购买 nike

我目前全神贯注于 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com