读取(文本)文件块
Reading (text) files in blocks
我目前对c++中的I/O操作都很感兴趣,我遇到了以特定大小的块(如1024Bytes)读取和/或写入数据的方法,而不是一次读取整个文件。现在我对这个概念有几个问题:
- 这样做的好处是什么?仅仅是因为一次可以读取多少字节是有限制的吗?或者这是否会带来显著的加速?它可能只用于套接字连接,或者用于不知道大小的文件?
- 如果这是有用的所有类型的文件(像一个文本文件配置值在它),我怎么能正确地处理一个块?请看下面的例子:
假设一个配置文件的结构是这样的:
[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>());
相关文章:
- 文本文件中的单词链表
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 如何将内容数组写入文本文件?
- 无法通过空白将文本文件行分隔为矢量
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- C++将文本文件中的数据读取到结构数组中
- 在指针的帮助下,文本文件中单词的频率
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将值从二维数组输出到文本文件
- 如何使用 c++ 实现并发文件/文本编辑?
- 我需要转换一些代码,以便它适用于输入和输出文件文本
- 通过套接字发送二进制文件.文本文件有效,其他文件无效
- 将大型数据文件拆分为多个小文件(文本格式)
- 如何读取输入文件(文本文件)并将输入验证为有效整数
- 从文本文件/文本流中读取Q字符串错误
- 从文本文件(文本解析器)C++中读取行和列的逻辑
- 如何将*.css文件(文本文件)的内容与附加信息存储在新文件中?
- 关于内存映射文件和使用大文件文本编辑器
- 如何在读取文件文本时跳过"n"
- 使用libzip从.zip获取文件(文本除外)