使用ofstream输出数据时令人暴寒的错误!0A = 0D 0A?

原创 2005年05月25日 09:24:00

前一阵子用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终于归位了。

after Normal block(#47) at 0x001D3908 错误的一次解决经历

代码: waveform = (s16*) malloc(SIZE_BUFFER);  接着free(waveform),其中SIZE_BUFFER是1024*2个字节 。 我想往这块内存写入1024...

vs2010创建Dll例子,并解决运行错误:应用程序正常初始化(0xc000000d)失败。请单击“确定”,终止应用程序。

调用Dll的工程遇到应用程序正常初始化(0xc000000d)失败。请单击“确定”,终止应用程序。 我的开发环境是Win32 XP,VS2010 最终找到原因,之前使用的是Debug模式,应该使用...
  • sonikk
  • sonikk
  • 2012年07月24日 10:26
  • 11747

关于错误 Unhandled exception in (KERNEL32.DLL):0xE06D7363:Microsoft C++ Exce vc and access insert 记录

insert 后退出m_AdoConn.ExitConnect();数据库,界面关闭时报错:  Unhandled exception in (KERNEL32.DLL):0xE06D7363:Mi...
  • wyx100
  • wyx100
  • 2012年09月12日 15:21
  • 2048

win7打印机共享出现0x000006d9错误的解决方法

这两天在WIN7上安装了一个HP1320打印机,装驱动,后来共享,在共享的时候出错了,发现问题,竟然无法共享打印机   发现出现“0x000006d9 错误”,在开始的时候测试...

解决错误503:com.sun.mail.smtp.SMTPAddressFailedException: 503 the server need auth(15D98013BE0)

最近遇见了一奇葩的问题:排查14年其他人开发的系统(已经接近退休的项目,突然领导要看)无法发送邮件的过程中发现在linux下无法发送邮件,并且报如下错误: javax.mail.SendFailed...

虚拟服务器Windwos server 2003远程安装SQL server 2008R2提示0x2d2816fe错误解决办法

今日将学校用财务查询服务器数据库从SQl server 2000升级到SQL server2008 R2,磨难多多,最后终于解决,现将安装升级记录如下: 一、升级背景 原单位所用财务管理软件使用...
  • hh8lu
  • hh8lu
  • 2016年02月01日 23:44
  • 558

转:C语言中的printf用%d输出float类型数据出现或以%f输出int型数据的结果为什么是0

原文地址:C语言中的printf用%d输出float类型数据出现或以%f输出int型数据的结果为什么是0...

配置c3p0数据源的时候提示的错误

配置c3p0数据源时,提示的几个空指针异常错误,以及配置多个数据源
  • mtcurry
  • mtcurry
  • 2016年07月22日 18:18
  • 1466

向SQL2005导入Excel数据出现“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”的错误0xc020901c

    在向SQL2005导入Excel数据时,出现以下错误:* 错误 0xc020901c: 数据流任务: 输出“Excel 源输出”(9) 上的 输出列“hw_content”(63) 出错。返回...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用ofstream输出数据时令人暴寒的错误!0A = 0D 0A?
举报原因:
原因补充:

(最多只允许输入30个字)