std::ofstream::write 添加字符

Posted

技术标签:

【中文标题】std::ofstream::write 添加字符【英文标题】:std::ofstream::write adds characters 【发布时间】:2014-02-24 08:45:31 【问题描述】:

我正在尝试使用std::ofstream::write 方法编写二进制文件。我发现,有些字符不是按原样写的,例如:

std::ofstream in("testout");
int i =10;

in.write((const char *)(&i), sizeof(i));
in.close();

return 0;

将以下内容写入二进制文件:0d 0a 00 00 00 为什么会出现额外的0d 字节?

【问题讨论】:

【参考方案1】:

您必须在打开时指定std::ofstream::binary

否则,在文本文件模式下的 Windows 上,程序中的 \n (0x0a) 将在写入/读取文件时转换为 \r\n (0x0d 0x0a)。

【讨论】:

@MarkGarcia 在 SO 上没有诗 ;) 很好,它被永久保存在编辑部分:p 但是在阅读这里的答案时想到一个俳句......仅此一项就足够了:) 您可能会补充说,仅二进制模式不足以确保他可以重新读取文件。您不能只是将内存映像转储到磁盘并期望稍后重新读取它们。 (他需要reinterpret_cast 来执行此操作这一事实应该很好地表明它不会起作用。)【参考方案2】:

您以文本模式打开文件并在 Windows 上运行。它将0x0d 添加到0x0a。创建ofstream实例时需要使用二进制模式。

【讨论】:

【参考方案3】:

正在将文件写入进行文本到二进制转换的系统上。 i 的最低字节中的值 10(十六进制 0A)被解释为换行符(又名换行符),并被转换为回车换行序列(十进制 13 10,十六进制 0D 0A)。

要解决此问题,请将代码的第一行 sn-p 更改为如下:

std::ofstream in("testout", std::ios::binary);

这将指示 C++ 运行时库将文件视为二进制文件,并且不在换行符和回车换行序列之间执行任何字节转换。

【讨论】:

以上是关于std::ofstream::write 添加字符的主要内容,如果未能解决你的问题,请参考以下文章

51Nod - 1092 回文字符串(添加删除字符LCS变形)

C#在字符串中添加一个字符

如何将字符添加到字符串中

5.13 添加最少字符使字符串整体都是回文字符串

Linux使用sed命令添加字符串方法教程

通过向字符串添加 char 来填充字符串