运行以下代码:
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运行的。
有人能解释一下吗?
答案 0 :(得分:2)
看起来流对象会自动将LineFeed(0xA或10)扩展为Windows友好的CarriageReturn-LineFeed对(0xD 0xA)。
答案 1 :(得分:1)
这是设计的。您正在以文本模式打开文件。 Windows在文本模式下将'\n'
(0x0A)转换为0D 0A。另外注意不要在这样的文件中写入0x1A(它是文本文件的EOF)。
我不知道文件的用途,但是如果它应该存储二进制数据,那么它应该以二进制模式打开。
答案 2 :(得分:0)
我怀疑你期待它打印&#34; 10&#34;,换句话说,字符串&#39; 1&#39;,&#39; 0&#39;到文件。
但是char
通常在C中被解释为字符串的一个字符,而不是数字。数字的通用数据类型是int
。
所发生的事情是,iostreams函数默认为将char
解释为值为10的ASCII字符&#34;换行符&#34;。如果你想实际打印10然后将char
更改为int
或重写输出行以使用静态强制转换,如下所示:
filefl << static_cast<int>(a);