1

运行以下代码:

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运行的。
有人可以解释一下吗?

4

3 回答 3

2

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

于 2013-05-15T20:53:27.983 回答
1

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

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

于 2013-05-15T20:54:05.327 回答
0

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

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

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

filefl << static_cast<int>(a);
于 2013-05-15T21:40:26.790 回答