【问题标题】:writing numbers to file - strange result将数字写入文件 - 奇怪的结果
【发布时间】:2013-05-15 20:50:38
【问题描述】:

运行以下代码:

ofstream newfile(path + "file" + ".hash", fstream::out);
filefl.open(path + "file" + ".hash", fstream::out);
char  a = 10;
filefl<<a;
filefl.close();

生成一个包含0D 0A 的文件(使用十六进制编辑器查看)。
a=9 包含09 的文件时。
sizeof(char) 是 1。
我的操作系统是win7 x64,代码是通过vs2010 pro运行的。
有人可以解释一下吗?

【问题讨论】:

  • 您实际期望的结果是什么? 0D 0A 是回车换行。您的操作系统可能会将您的 10(即 0A)扩展为 CRLF 组合。您应该以任何可用的二进制模式打开文件。
  • 10 由流转换为回车/换行组合。这是 Windows 特定的顺便说一句。

标签: c++ ofstream


【解决方案1】:

看起来流对象正在自动将 LineFeed(0xA 或 10)扩展为 Windows 友好的 CarriageReturn-LineFeed 对 (0xD 0xA)。

【讨论】:

  • 如果您不想要这种行为,请以二进制模式打开文件进行读写。
【解决方案2】:

这是设计使然。您正在以文本模式打开文件。 Windows 在文本模式下将 '\n' (0x0A) 转换为 0D 0A。还要注意不要将 0x1A 写入此类文件(它是文本文件的 EOF)。

我不知道这个文件的用途,但是如果它应该存储二进制数据,那么它应该以二进制模式打开。

【讨论】:

    【解决方案3】:

    我怀疑您希望它在文件中打印“10”,即字符串“1”、“0”。

    但是char 通常在 C 中被解释为字符串的一个字符,而不是数字。数字的常用数据类型是int

    所以发生的事情是 iostreams 函数默认将值 10 的 char 解释为 ASCII 字符“换行符”。如果您想实际打印 10,请将 char 更改为 int 或重写输出行以使用静态转换,如下所示:

    filefl << static_cast<int>(a);
    

    【讨论】:

    • 我不是。我正在尝试写0x0A
    • @elyashiv:那么提示:C 程序员没有将字符写成数字的习惯。您应该使用'\n''\x0a' 来表明您打算将其用作文本字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 2016-06-15
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多