Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.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++ fstream中的write函数将导致Windows 10出现错误_C++_System - Fatal编程技术网

C++ fstream中的write函数将导致Windows 10出现错误

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 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行结束时,它会将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调用。