为什么std :: ofstream会添加额外的#13(换行符)字符?

时间:2018-03-21 11:22:18

标签: c++ windows newline fstream ostream

我正在使用基本的std::ofstream对象,创建如下:

output_stream = std::ofstream(output_file.c_str());

这会创建一个文件,其中会放入一些信息。让我展示一下这样一条消息的示例:(观看窗口摘录)

full_Message    "Error while processing message:\r\n\tForecast Request:"

所有这一切都没问题,但在启动以下命令后,出现了一个问题:

output_stream << full_Message;
output_stream.flush();

为了查看错误,让我们看一下文件的十六进制转储:(这是文件的十六进制显示,如Notepad ++中所示。为清楚起见,我已截取屏幕截图。)

Notepad++ Hexdump screenshot

如您所见,角色0d加倍,导致以下显示:

Error while processing message:

    Forecast Request:

(换行线太多,两行应该一个接一个地直接)

我知道在从UNIX / Linux到Windows进行文件转换时添加了#13字符,但这与此无关:我纯粹是在Windows系统上使用Windows文件,所以不需要添加任何#13字符。

有人知道如何避免添加这个额外的角色吗?

提前致谢

2 个答案:

答案 0 :(得分:5)

流默认为文本模式,这意味着在Windows中,如果您编写\n,则文件将获得\r\n。因此,如果您编写\r\n,则文件会获得\r\r\n

要解决此问题,请在代码中写下\n;或者以二进制模式打开文件:

auto output_stream = std::ofstream(output_file.c_str(), std::ios::binary);

答案 1 :(得分:1)

因为默认情况下,库会将do for (( k = i; k <= n; k++ )) do echo -ne " " done for (( j = 1; j <= 2 * i - 1; j++ )) do echo -ne "*" done 转换为'\n',以便在需要它的平台(如Windows)上转换文本流。

因此,您不需要在字符串中明确回车。它会自动处理。

如果要明确指定回车符,则需要以二进制模式打开文件。

在阅读文字流时,会发生相反的转化,"\r\n"转换为"\r\n"