提问人:T. Grumser 提问时间:3/17/2022 最后编辑:Cody Gray - on strikeT. Grumser 更新时间:3/17/2022 访问量:82
不同的字符值在文件 [duplicate] 中需要不同的大小
Different char values require different sizes in file [duplicate]
问:
我有这个代码片段来将缓冲区写入文件
int WriteBufferToFile(std::string path, const char* buffer, int bufferSize) {
std::ofstream ofs;
ofs.open(path);
if (!ofs) {
return 1;
}
ofs.write(buffer, bufferSize);
if (!ofs) {
return 2;
}
ofs.close();
return 0;
}
案例 1
std::vector<char> buffer(1000000, 0);
WriteBufferToFile("myRawData", buffer.data(), 1000000);
案例 2
std::vector<char> buffer(1000000);
for (int i = 0; i < 1000000; i++) {
buffer[i] = char(i);
}
WriteBufferToFile("myRawData2", buffer.data(), 1000000);
在情况 1 中,我将 1mb 的零写入一个文件,该文件的大小也将为 1mb,但在第二种情况下,我将任意字符(在 RAM 中仍应为 1mb)写入文件,但现在(在我的测试中,尤其是当包含 char 的 >= 10 时)文件大小增加。
为什么会这样,有没有办法解决这个问题?
答:
3赞
j6t
3/17/2022
#1
您似乎在 Windows 上。看起来 C++ 运行时将 1 字节换行符重写为 Windows 样式的 2 字节序列。因此,文件中大约有 1000000/256=3906.25 个额外的字节。'\n'
"\r\n"
8赞
Ferruccio
3/17/2022
#2
我要大胆猜测一下,说你正在 Windows 系统上运行此代码。
这是我认为可能正在发生的事情。
ofs.open(path)
正在以文本模式打开文件。在 Windows 上,文本模式意味着每个换行符(1 个字节)都将替换为 CRLF 序列(2 个字节)。缓冲区包含 100 万个字符,其中填充了 0 到 999999 模 256 的值。因此,256 个字符(确切地说是 3906 个字符)中的 1 将被一个 2 字节的序列替换,该序列解释了文件大小差异。
要解决此问题,请在二进制模式下打开文件:
ofs.open(path, ios_base::out | ios_base::binary)
上一个:从输入文件写入输出文件
评论
100
10000000
char