我目前全神贯注于 C++ 中的 I/O 操作,我遇到了以特定大小(如 1024 字节)的 block 而不是一次读取和/或写入整个文件的数据的方法。现在我对这个概念有几个疑问:
- 这样做有什么好处?仅仅是因为一次可以读取多少字节有限制吗?或者这会显着加快速度吗?它可能只用于套接字连接,还是用于预先不知道大小的文件?
- 如果这对所有类型的文件都有用(比如包含配置值的文本文件),我该如何正确处理 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/