为什么 std::ofstream 添加额外的 #13(换行符)字符?
Why does std::ofstream add extra #13 (newline) characters?
我正在使用一个基本的 std::ofstream
对象,创建如下:
output_stream = std::ofstream(output_file.c_str());
这会创建一个文件,其中包含一些信息。让我举一个此类消息的示例:(观看 window 摘录)
full_Message "Error while processing message:\r\n\tForecast Request:"
一切正常,但是在启动以下命令后,出现问题:
output_stream << full_Message;
output_stream.flush();
为了了解问题所在,让我们看一下文件的十六进制转储:(这是文件的十六进制显示,如在 Notepad++ 中所见。为清楚起见,我截取了屏幕截图。)
如您所见,字符 0d
被加倍,结果显示如下:
Error while processing message:
Forecast Request:
(换行太多了,两行直接一个接一个)
我知道在将文件从 UNIX/Linux 转换为 Windows 时添加了 #13
个字符,但这与此处无关:我纯粹是在使用 Windows 文件,在 Windows 系统上,因此不需要添加任何 #13
字符。
有人知道如何避免添加这个额外的字符吗?
提前致谢
因为默认情况下,对于需要它的平台(如 Windows)上的文本流,库会将 '\n'
转换为 "\r\n"
。
因此您不需要在字符串中显式 carriage-return。它是自动处理的。
如果要明确指定carriage-return,则需要以二进制模式打开文件。
读取文本流时,发生相反的转换,"\r\n"
被转换为 '\n'
。
流默认为 文本模式,这意味着在 Windows 中,如果您写入 \n
,则文件将变为 \r\n
。因此,如果您编写 \r\n
,则文件将变为 \r\r\n
.
要解决这个问题,要么只在代码中写入 \n
;要么或以 二进制模式 :
打开文件
auto output_stream = std::ofstream(output_file.c_str(), std::ios::binary);
我正在使用一个基本的 std::ofstream
对象,创建如下:
output_stream = std::ofstream(output_file.c_str());
这会创建一个文件,其中包含一些信息。让我举一个此类消息的示例:(观看 window 摘录)
full_Message "Error while processing message:\r\n\tForecast Request:"
一切正常,但是在启动以下命令后,出现问题:
output_stream << full_Message;
output_stream.flush();
为了了解问题所在,让我们看一下文件的十六进制转储:(这是文件的十六进制显示,如在 Notepad++ 中所见。为清楚起见,我截取了屏幕截图。)
如您所见,字符 0d
被加倍,结果显示如下:
Error while processing message:
Forecast Request:
(换行太多了,两行直接一个接一个)
我知道在将文件从 UNIX/Linux 转换为 Windows 时添加了 #13
个字符,但这与此处无关:我纯粹是在使用 Windows 文件,在 Windows 系统上,因此不需要添加任何 #13
字符。
有人知道如何避免添加这个额外的字符吗?
提前致谢
因为默认情况下,对于需要它的平台(如 Windows)上的文本流,库会将 '\n'
转换为 "\r\n"
。
因此您不需要在字符串中显式 carriage-return。它是自动处理的。
如果要明确指定carriage-return,则需要以二进制模式打开文件。
读取文本流时,发生相反的转换,"\r\n"
被转换为 '\n'
。
流默认为 文本模式,这意味着在 Windows 中,如果您写入 \n
,则文件将变为 \r\n
。因此,如果您编写 \r\n
,则文件将变为 \r\r\n
.
要解决这个问题,要么只在代码中写入 \n
;要么或以 二进制模式 :
auto output_stream = std::ofstream(output_file.c_str(), std::ios::binary);