为什么ofstream在0x0A之前插入了一个0x0D字节?

8
我正在使用ofstream fout("filename");在C++中输出一个无符号字符数组,但是它会在中间产生一个错误字符。这是导致问题的代码部分:
for(int i = 0; i < 12; i++)
fout << DChuffTable[i];

这是数组的定义:

unsigned char DChuffTable[12] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B};

在输出文件中,我得到了一个虚假的“0x0D”,它在“0x09”和“0x0A”之间。在打印之前,我在调试模式下检查了数组,它没有改变。请告诉我您对这个问题的看法。
1个回答

21

你的流以文本模式打开,而由于0x0A是换行符(LF)字符,因此你的流将其转换为0x0D0x0A,即CR/LF。

请使用二进制模式打开流:

std::ofstream fout("filename", std::ios_base::out | std::ios_base::binary);

那么行尾转换不应该被执行。

通常情况下,这也被认为是一个好主意,因为在文本模式下流可以变得奇怪而无法刷新。


非常感谢,我没有想到那个问题。虽然我怀疑这个问题在Linux中不会出现。对吗? - raven
@raven:同样的情况也适用,但由于Unix系统使用“\n”作为行结尾,因此您可能没有注意到任何症状。不过,这仍然是错误的代码。 :) - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接