不同的 char 值需要不同的文件大小
Different char values require different sizes in file
我有这段代码可以将缓冲区写入文件
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;
}
案例一
std::vector<char> buffer(1000000, 0);
WriteBufferToFile("myRawData", buffer.data(), 1000000);
案例二
std::vector<char> buffer(1000000);
for (int i = 0; i < 1000000; i++) {
buffer[i] = char(i);
}
WriteBufferToFile("myRawData2", buffer.data(), 1000000);
在第一种情况下,我将 1mb 的零写入一个文件,该文件的大小也为 1mb,但在第二种情况下,我将任意字符(在 RAM 中仍应为 1mb)写入一个文件,但是现在(在我的测试中,尤其是当包含 char 的 >= 10 时)文件大小增加了。
为什么会这样,有没有办法解决这个问题?
您似乎在 Windows。看起来 C++ 运行时将 1 字节换行符 '\n'
重写为 windows 样式的 2 字节序列 "\r\n"
。因此,文件中有大约 1000000/256=3906.25 个额外字节。
我要大胆猜测一下,你是 运行 Windows 系统上的这段代码。
以下是我认为可能发生的情况。
ofs.open(path)
正在以文本模式打开文件。在 Windows 上,文本模式意味着每个换行符(1 个字节)将被 CRLF 序列(2 个字节)替换。您的缓冲区包含 100 万个字符,其中填充了 0 到 999999 模 256 的值。因此 256 个字符上的 1(准确地说是 3906)将被一个 2 字节的序列替换,这说明了文件大小的差异。
要解决此问题,请以二进制模式打开文件:
ofs.open(path, ios_base::out | ios_base::binary)
我有这段代码可以将缓冲区写入文件
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;
}
案例一
std::vector<char> buffer(1000000, 0);
WriteBufferToFile("myRawData", buffer.data(), 1000000);
案例二
std::vector<char> buffer(1000000);
for (int i = 0; i < 1000000; i++) {
buffer[i] = char(i);
}
WriteBufferToFile("myRawData2", buffer.data(), 1000000);
在第一种情况下,我将 1mb 的零写入一个文件,该文件的大小也为 1mb,但在第二种情况下,我将任意字符(在 RAM 中仍应为 1mb)写入一个文件,但是现在(在我的测试中,尤其是当包含 char 的 >= 10 时)文件大小增加了。
为什么会这样,有没有办法解决这个问题?
您似乎在 Windows。看起来 C++ 运行时将 1 字节换行符 '\n'
重写为 windows 样式的 2 字节序列 "\r\n"
。因此,文件中有大约 1000000/256=3906.25 个额外字节。
我要大胆猜测一下,你是 运行 Windows 系统上的这段代码。
以下是我认为可能发生的情况。
ofs.open(path)
正在以文本模式打开文件。在 Windows 上,文本模式意味着每个换行符(1 个字节)将被 CRLF 序列(2 个字节)替换。您的缓冲区包含 100 万个字符,其中填充了 0 到 999999 模 256 的值。因此 256 个字符上的 1(准确地说是 3906)将被一个 2 字节的序列替换,这说明了文件大小的差异。
要解决此问题,请以二进制模式打开文件:
ofs.open(path, ios_base::out | ios_base::binary)