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

Posted

技术标签:

【中文标题】C ++(Visual Studio),无法将数字“10”写入文件,所有其他数字都有效吗?【英文标题】:C++ (Visual Studio), Can't write the number '10' to file, all other numbers working? 【发布时间】:2011-02-11 18:46:34 【问题描述】:

我这里有一个奇怪的问题! 我正在尝试为 8 位 windows 3.x 位图文件编写颜色表。我只是希望文件是灰度的,所以我试图写 bbb0, ggg0, rrr0 256 次 where 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 00 0D 0A 0D 0A 0D 0A 00 09 09 09 00 08 08 08 00...

不是:

...0C 0C 0C 00 0B 0B 0B 00 0A 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

给予:

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

符号有什么奇怪的地方吗?我错过了任何明显的错误吗?有没有人遇到过这样的事情? 谢谢!

【问题讨论】:

【参考方案1】:

ASCII 中的“数字 10”是换行符,\n。在 C++ 中,这是换行符。

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

希望这会有所帮助!

【讨论】:

【参考方案4】:

正如上面的人所说,二进制和文本之间有很大的区别。 10 将在流中被弄乱,并且会有丢失/额外的字节。

以二进制打开!

【讨论】:

以上是关于C ++(Visual Studio),无法将数字“10”写入文件,所有其他数字都有效吗?的主要内容,如果未能解决你的问题,请参考以下文章

无法将 Visual Studio 代码连接到 PHP

Visual Studio 2017 无法使用库构建

无法将 User32.dll 导入 Visual Studio

在Visual Studio中构建的代码将无法在TFS中生成

将Visual Studio 2017中的Assembly和C ++与命令行和输出相结合

基本字符串操作存在问题 [c+​​+, visual studio 2013]