Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;(visualstudio),Can';不要写数字';10';要归档,所有其他数字都有效吗?_C++_Visual Studio 2008_Visual C++_File Io - Fatal编程技术网

C++ C++;(visualstudio),Can';不要写数字';10';要归档,所有其他数字都有效吗?

C++ C++;(visualstudio),Can';不要写数字';10';要归档,所有其他数字都有效吗?,c++,visual-studio-2008,visual-c++,file-io,C++,Visual Studio 2008,Visual C++,File Io,我这里有点奇怪的问题! 我正在尝试为8位Windows3.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

我这里有点奇怪的问题! 我正在尝试为8位Windows3.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
}
当我使用十六进制编辑器查看得到的输出时,一切看起来都很好,直到我得到数字10,它是这样写的:

…0C 0C 0C 00 0B 0B 0B 000D 0A 0D 0A 0D 0A00 09 09 00 08 00

除此之外:

…0C 0C 0C 00 0B 0B 0B 000A 0A 0A00 09 09 00 08 00

这就是wierd,它只在这一个数字上做,但更为wierd的是,当我改变代码,跳过数字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
}
给出:

…0c0c0c000b0b0b000909000900800

记谱法有什么奇怪的地方吗?我遗漏了什么明显的错误?以前有人遇到过这样的事情吗? 谢谢

ASCII中的“数字10”是换行字符,
\n
。在C++中,这是换行符。 您显然已将该文件作为文本流打开。由于换行符在不同平台上的表示方式不同,因此文本流执行换行符转换:在读取时,它们将特定于平台的换行符表示转换为
\n
,在写入时,它们将
\n
字符转换为特定于平台的换行符表示

在Windows上,换行符由
\r\n
表示。当您将
\n
写入文本流时,它将被写入
\r\n


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

字符号10是换行字符,如果文件在Windows上以文本模式打开,则会转换为CRLF组合(13+10)。以二进制模式打开文件。

发生这种情况的原因是您可能没有以二进制模式打开文件。在Windows中以正常(文本)模式打开文件时,每当您写入换行符(数值为10)时,流都会将其转换为\r\n,这就是为什么您在写入数字10时会看到额外字节的原因

要解决此问题,请以二进制模式打开文件:

outfile.open(filename, ios::binary);

希望这有帮助

正如上面提到的,二进制和文本之间有很大的区别。10将在流中出错,并且将丢失/额外字节

用二进制打开