使用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终于归位了。

“0d 0a”这两个字符是什么涵义

其实这是从打字机的概念来的:0x0d => /r, carrige return, 指打字头归位的动作0x0a => /n, new line, 指打字机上卷一行的动作Windows 在行尾使用 CR...
  • liuyukuan
  • liuyukuan
  • 2010年11月22日 14:50
  • 31131

彻底搞定回车0d和换行0a

什么是0x0d和0x0a ,可能大部分人都知道是回车和换行字符,但那个是回车,那个是换行?估计很多人都一时说不清楚了--- 也许你不相信,那就调查下周围的同事吧,估计会包含以下字眼“大概。我记得。...
  • e_wsq
  • e_wsq
  • 2017年06月09日 14:27
  • 1656

关于0x0d与0x0a的ASCII。

今天发现一个有趣的现象:在masm(我用的版本是6.11)中作汇编时发现,0x0d与0x0a有着不同的作用。比如:“dead for dream”在这个字符串后只加上0x0d则得到 “光标移到开头的那...
  • dobest9014
  • dobest9014
  • 2007年04月17日 21:43
  • 6339

Linux下接收串口数据0x0d变0X0a问题

许多流行的linux串口编程的版本中都没对c_iflag(termios成员变量)这个变量进行有效的设置,这样传送ASCII码时没什么问题,但传送二进制数据时遇到0x0d,0x11和0x13却会被丢掉...
  • jinchengzhou
  • jinchengzhou
  • 2016年07月23日 16:43
  • 1640

“0d 0a”这两个字符是什么涵义

其实这是从打字机的概念来的: 0x0d => /r, carrige return, 指打字头归位的动作 0x0a => /n, new line, 指打字机上卷一行的动作 Windows 在行...
  • baijinglei12
  • baijinglei12
  • 2016年08月04日 17:18
  • 892

关于文件中的0D、0A

文件一般分为文本文件和二进制文件。   在windows文本文件中,分行即‘\n“,表示为0x0D 0x0A。分为两种情况:  如果你想一个文本文件中写入一个'\n',文本文件中会增加0x0D...
  • frank_liuxing
  • frank_liuxing
  • 2013年12月04日 15:35
  • 1377

linux C语言 串口 上层发送0x0A,底层却发送了0x0D 0x0A两个字节的解决方法

struct termios options; options.c_iflag &= ~(INLCR | ICRNL | IGNCR);options.c_oflag &= ~(ONLCR | OCR...
  • qiaoliang328
  • qiaoliang328
  • 2011年01月20日 08:55
  • 2806

C++读写文件时,0A转化为0D 0A

用C++写东西,需要往文件里写数据,很简单的代码,大概是这个样子: #include using namespace std; int _tmain(int argc, _TCHAR*...
  • CNHK1225
  • CNHK1225
  • 2017年09月07日 16:45
  • 166

串口接收数据错误0D变0A问题

在调试串口软件过程中遇到一个烦人的问题,就是s
  • yang7531388
  • yang7531388
  • 2014年04月11日 10:33
  • 1956
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用ofstream输出数据时令人暴寒的错误!0A = 0D 0A?
举报原因:
原因补充:

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