使用ofstream输出数据时令人暴寒的错误!0A = 0D 0A?
2005-05-25 09:24
441 查看
前一阵子用C++写东西,需要往文件里写数据,很简单的代码,大概是这个样子:
#include <fstream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
ofstream fout;
fout.open("d://test.dat");
int a = 0x7788;
fout.write((char*) &a, sizeof(int));
}
打开test.dat,内容是77 88 00 00,很正常。
打开test.dat,内容是77 88 00 00,很正常。
但我要是把a的值改成0x0a,毛病就出来了,写出来的东西是:0D 0A 00 00 00!
要是把a改成0x770a或者是别的什么0a,只要是数字中某一个字节是0a,写出来以后肯定变成0D 0A!比如0x770a就变成0D 0A 77!
更让人寒的是,即使规定写出的只能是一个字节,即写:
fout.write((char*) &a, sizeof(char));
只要a的值的高字节是0a,写出来一样变成0D 0A!也就是指定输出1个字节,实际却输出了2个字节!
真是让人费解啊。我一度认为C++出现了有史以来最莫名其妙的BUG,不过,且慢……
0A是什么?0D 0A又是什么?这个问题的解原来在这里。先查查C++的文档,里面说明,ofstream的open函数,第二个参数指明打开方式,缺省为ios_base::out,即按照字节流的方式输出文本。再看看0A到底是什么,原来ASCII的0A是换行,也就是/n,再想想,Windows系统下的换行是如何处理的?/r/n啊。原来……
原来按照字节流的形式输出文本时,ofstream会自动将输出的/n变成/r/n,以适应WIndows系统,结果以输出数据的角度看来,这个正常的举动就变成了不可解的“0A变成0D 0A”。
既然如此,答案也出来了,查查文档,将打开文件的一句改成:
fout.open("d://test.dat", ios_base::out | ios_base::binary);
捣乱的0A终于归位了。
#include <fstream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
ofstream fout;
fout.open("d://test.dat");
int a = 0x7788;
fout.write((char*) &a, sizeof(int));
}
打开test.dat,内容是77 88 00 00,很正常。
打开test.dat,内容是77 88 00 00,很正常。
但我要是把a的值改成0x0a,毛病就出来了,写出来的东西是:0D 0A 00 00 00!
要是把a改成0x770a或者是别的什么0a,只要是数字中某一个字节是0a,写出来以后肯定变成0D 0A!比如0x770a就变成0D 0A 77!
更让人寒的是,即使规定写出的只能是一个字节,即写:
fout.write((char*) &a, sizeof(char));
只要a的值的高字节是0a,写出来一样变成0D 0A!也就是指定输出1个字节,实际却输出了2个字节!
真是让人费解啊。我一度认为C++出现了有史以来最莫名其妙的BUG,不过,且慢……
0A是什么?0D 0A又是什么?这个问题的解原来在这里。先查查C++的文档,里面说明,ofstream的open函数,第二个参数指明打开方式,缺省为ios_base::out,即按照字节流的方式输出文本。再看看0A到底是什么,原来ASCII的0A是换行,也就是/n,再想想,Windows系统下的换行是如何处理的?/r/n啊。原来……
原来按照字节流的形式输出文本时,ofstream会自动将输出的/n变成/r/n,以适应WIndows系统,结果以输出数据的角度看来,这个正常的举动就变成了不可解的“0A变成0D 0A”。
既然如此,答案也出来了,查查文档,将打开文件的一句改成:
fout.open("d://test.dat", ios_base::out | ios_base::binary);
捣乱的0A终于归位了。
相关文章推荐
- 使用ofstream输出数据时令人暴寒的错误!0A = 0D 0A?
- CodeBlocks上使用long double数据类型输出错误的解决方案
- 使用python将Sqlite中的数据直接输出为CVS
- 模型中添加属性导致数据表中不存在column的错误,使用的数据表的模型与属性区分开的处理
- springmvc使用@requestBody注释json数据,浏览器错误415
- EF(EntityFramework)与mysql使用,取数据报错,linq实体映射错误
- 【转】ArcSDE复制数据时出现ORA-00955名称已由现有对象使用错误的解决方法
- 使用QueryTables生成Excel数据时发生错误
- 【C语言】使用指向指针数据的指针变量,输出一组字符串
- xdebug(32) : warning C4229: 使用了记时错误 : 忽略数据上的修饰符
- lesson 11:使用TCP协议编写一个网络程序,设置服务器端的监听端口是8002,当与客户端建立连接后,服务器端向客户端发送数据“Hello, world”,客户端收到数据后打印输出。
- Linux虚拟机下switch语句汇编输出,数据传送使用栈指针
- 解决 JScript 中使用日期类型数据时出现类型错误的问题
- 如何使用小脚本和表达式链接数据库输出emp表的数据
- 使用正则表达式快速修改mysql中错误的varchar类型数据
- 使用Java 输出/输出流读写数据
- C++类中包含string类型数据使用read和write实现文件读取和输出时遇到的问题
- Oracle SQL Lesson (5) - 使用组函数输出聚合数据
- ofstream文件输出流把二进制数据写入文件
- .Net使用DES解密发生“数据不正确”的错误