不同的 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)