C++ fstream中的write函数将导致Windows 10出现错误
在Windows 10上运行此代码时出现问题。如图所示,我10岁的时候出了问题。应该是0A 0A 0A 00而不是 0D 0A 0D 0A 0D 0A 00。C++ fstream中的write函数将导致Windows 10出现错误,c++,system,C++,System,在Windows 10上运行此代码时出现问题。如图所示,我10岁的时候出了问题。应该是0A 0A 0A 00而不是 0D 0A 0D 0A 0D 0A 00。 评论是正确的,但没有解释: Windows惯例是使用CR+LF组合来表示编码为0x0D和0x0A的行尾。 C++使用\n表示一条新的线,Visual C++作为0x0a编码。另外,Visual C++将\r作为0x0d编码。 为了允许编写可移植代码,fstream将自动转换行尾表示。这意味着,当在文本模式下打开时,每次写入C++ +N行结
评论是正确的,但没有解释: Windows惯例是使用CR+LF组合来表示编码为0x0D和0x0A的行尾。 C++使用\n表示一条新的线,Visual C++作为0x0a编码。另外,Visual C++将\r作为0x0d编码。 为了允许编写可移植代码,fstream将自动转换行尾表示。这意味着,当在文本模式下打开时,每次写入C++ +N行结束时,它会将CR+LF= 0x0D 0x0A序列写入文件。 fstream在读取时也会以相反的方向进行转换。 您可以通过将ios::binary选项传递给fstream来修复它,告诉它您的数据是二进制的,而不是文本,因此它不能进行替换::
#include <fstream>
using namespace std;
int main()
{
fstream outfile("datafile.txt", ios::out);
char colorArry[1024];
for (int i = 0; i < 256; i++)
{
colorArry[i * 4] = i&0xff;
colorArry[i * 4 + 1] = i&0xff;
colorArry[i * 4 + 2] = i&0xff;
colorArry[i * 4 + 3] = 0b00000000;
}
outfile.write(colorArry, 1024);
outfile.close();
return 0;
}
Linux不受影响,因为它只使用LF 0x0A来表示行的结尾,并且Linux编译器也一致地将\n编码为0x0A。因此,fstream不进行替代。这就是为什么在Linux上运行代码时不会出现问题。注释是正确的,但没有解释: Windows惯例是使用CR+LF组合来表示编码为0x0D和0x0A的行尾。 C++使用\n表示一条新的线,Visual C++作为0x0a编码。另外,Visual C++将\r作为0x0d编码。 为了允许编写可移植代码,fstream将自动转换行尾表示。这意味着,当在文本模式下打开时,每次写入C++ +N行结束时,它会将CR+LF= 0x0D 0x0A序列写入文件。 fstream在读取时也会以相反的方向进行转换。 您可以通过将ios::binary选项传递给fstream来修复它,告诉它您的数据是二进制的,而不是文本,因此它不能进行替换::
#include <fstream>
using namespace std;
int main()
{
fstream outfile("datafile.txt", ios::out);
char colorArry[1024];
for (int i = 0; i < 256; i++)
{
colorArry[i * 4] = i&0xff;
colorArry[i * 4 + 1] = i&0xff;
colorArry[i * 4 + 2] = i&0xff;
colorArry[i * 4 + 3] = 0b00000000;
}
outfile.write(colorArry, 1024);
outfile.close();
return 0;
}
Linux不受影响,因为它只使用LF 0x0A来表示行的结尾,并且Linux编译器也一致地将\n编码为0x0A。因此,fstream不进行替代。这就是为什么在Linux上运行代码时不会出现问题。以ios::binary模式打开文件。我完全同意这是Windows 10中的一个bug。永远无法修复的错误。@πάνταῥεῖ 事实上,这并不是因为我开错了门。这段代码在LinuxUbuntu上运行良好。@chuang fstream outfiledatafile.txt,ios::out | ios::binary@πάνταῥεῖ 它似乎起作用了。我以后会参加更多的考试。非常感谢。以ios::binary模式打开该文件。我完全同意这是Windows 10中的一个bug。永远无法修复的错误。@πάνταῥεῖ 事实上,这并不是因为我开错了门。这段代码在LinuxUbuntu上运行良好。@chuang fstream outfiledatafile.txt,ios::out | ios::binary@πάνταῥεῖ 它似乎起作用了。我以后会参加更多的考试。非常感谢。我相信执行翻译的实际上是底层操作系统的东西,而不是fstream-fstream翻译并通过您的标志。@LightnessRacesinOrbit嗯,这是个好问题。我相信它在引擎盖下使用。如果这是正确的,CreateFile没有二进制/文本差异。哈,看来你是对的!是的,在Windows下,控制台具有文本/原始的区别。请参阅SetConsoleMode,特别是启用\u处理的\u输出。对于已处理的输出,\n将转换为SetConsoleUrsOrposition调用。我相信执行转换的实际上是底层操作系统,而不是fstream-fstream将转换并通过您的标志。@LightnessRacesinOrbit嗯,这是一个好问题。我相信它在引擎盖下使用。如果这是正确的,CreateFile没有二进制/文本差异。哈,看来你是对的!是的,在Windows下,控制台具有文本/原始的区别。请参阅SetConsoleMode,特别是启用\u处理的\u输出。对于已处理的输出,\n转换为SetConsoleorPosition调用。