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

标签 c++ windows newline fstream ostream

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

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

这会创建一个文件,其中包含一些信息。让我展示这样一条消息的示例:(Watch 窗口摘录)

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字符。

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

提前致谢

最佳答案

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

要解决这个问题,要么只在代码中写入 \n;要么或以二进制模式打开文件:

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

关于c++ - 为什么 std::ofstream 添加额外的#13(换行符)字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49405020/

相关文章:

c++ - 如果实际对象是非常量,const_cast(this) 是否具有写操作未定义行为?

c++ - 最小唯一字符

c++ - vector 的 push_back 错误背后的原因是什么

c++ - 我如何使用 std::constructible_from

windows - 在 Eclipse 中创建新的 gradle 项目时无法选择完成

http - 如何使用 curl 发送换行符?

c# - GetFilesAsync 能否仅选择 *.png 图像?

c++ - 向 VS C++ 控制台程序添加视觉效果

c# - 如何在C#中使用StreamWriter.WriteLine方法写入unix行结束符 '\n'?

C#:如何在 MessageBox 中显示换行符