不同的字符值在文件 [duplicate] 中需要不同的大小

Different char values require different sizes in file [duplicate]

提问人:T. Grumser 提问时间:3/17/2022 最后编辑:Cody Gray - on strikeT. Grumser 更新时间:3/17/2022 访问量:82

问:

我有这个代码片段来将缓冲区写入文件

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 时)文件大小增加。

enter image description here

为什么会这样,有没有办法解决这个问题?

C++ Windows 换行符 IOSTREAM ofstream

评论

1赞 molbdnilo 3/17/2022
怎么好像不是这样?你是怎么检查的?(为什么您认为文件中会有标头或“转义字符”?
0赞 mch 3/17/2022
你如何将 改 ?该数字不适合 .10010000000char
0赞 T. Grumser 3/17/2022
我用一个例子更新了这个问题。
1赞 Fareanor 3/17/2022
我无法重现,正如预期的那样,该文件在我的测试中正好占用了 100 个字节。
0赞 adnan_e 3/17/2022
@T.Grumser 你如何测量文件大小?

答:

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)