C++(Visual Studio),无法将数字'10'写入文件,其他所有数字都有效吗?

Cha*_*les 4 c++ file-io visual-studio-2008 visual-c++

我这里有一个奇怪的问题!我正在尝试为8位Windows 3.x位图文件编写颜色表.我只是希望文件是灰度的,所以我想写bbb0,ggg0,rrr0 256次,其中r = g = b = 1..256

//write greyscale color table
for (int i = 255; i >= 0; i--) {
    writeS = (unsigned short)i;
    outfile.write ((char*)&writeS,sizeof(char)); // b
    outfile.write ((char*)&writeS,sizeof(char)); // g
    outfile.write ((char*)&writeS,sizeof(char)); // r
    writeS = 0;
    outfile.write ((char*)&writeS,sizeof(char)); // 0
}
Run Code Online (Sandbox Code Playgroud)

当我看到我使用十六进制编辑器得到的输出时,一切看起来都很好,直到我到达数字10,这是这样写的:

... 0C 0C 0C 00 0B 0B 0B 00 0D 0A 0D 0D 0A 00 09 09 09 00 08 08 08 00 ...

不是:

... 0C 0C 0C 00 0B 0B 0B 00 0A 0A 00 09 09 09 00 08 08 08 00 ......

所以很奇怪它只是在这一个数字上做,但更甚事更糟的是,当我改变代码跳过数字10而不是写9时,它就可以了.

//write greyscale color table
for (int i = 255; i >= 0; i--) {
    writeS = (unsigned short)i;
    if (writeS == 10) writeS = 9;
    outfile.write ((char*)&writeS,sizeof(char)); // b
    outfile.write ((char*)&writeS,sizeof(char)); // g
    outfile.write ((char*)&writeS,sizeof(char)); // r
    writeS = 0;
    outfile.write ((char*)&writeS,sizeof(char)); // 0
}
Run Code Online (Sandbox Code Playgroud)

得到:

... 0C 0C 0C 00 0B 0B 0B 00 09 09 09 00 09 09 09 00 08 08 08 00 ......

有没有奇怪的东西在那里用符号?我错过了哪些明显的错误?有没有人遇到过这样的事情?谢谢!

Jam*_*lis 13

ASCII中的"数字10"是换行符,\n.在C++中,这是换行符.

您显然已将文件作为文本流打开.由于换行在不同平台上的表示方式不同,因此文本流执行换行:在读取时,它们将特定于平台的换行表示转换为\n写入时,将\n字符转换为特定于平台的换行表示.

在Windows上,换行符由表示\r\n.当你写一个\n文本流时,它被写为\r\n.

要编写原始二进制数据,您需要将流打开为二进制流.这是通过将ios_base::binary标志传递给流的构造函数来完成的.