中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > 综合其它
使用ofstream输出数据时令人暴寒的错误!0A = 0D 0A?
作者:未知 时间:2005-07-27 23:26 出处:CSDN 责编:chinaitpower
              摘要:使用ofstream输出数据时令人暴寒的错误!0A = 0D 0A?

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


关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有