博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用ofstream输出数据时令人暴寒的错误!0A = 0D 0A?
阅读量:5776 次
发布时间:2019-06-18

本文共 959 字,大约阅读时间需要 3 分钟。

  hot3.png

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

转载于:https://my.oschina.net/leeldy/blog/108304

你可能感兴趣的文章
Linux常用命令(一)
查看>>
我的友情链接
查看>>
JS中比较数字大小
查看>>
jQuery插件的开发
查看>>
基础,基础,还是基础之JAVA基础
查看>>
如何成为一个C++高级程序员
查看>>
我的友情链接
查看>>
显式锁(第十三章)
查看>>
看linux书籍做的一些重要笔记(2011.07.03更新)
查看>>
从案例学RxAndroid开发(上)
查看>>
Redis学习手册(内存优化)
查看>>
浅尝TensorFlow on Kubernetes
查看>>
springboot系列十 Spring-Data-Redis
查看>>
excel进行矩阵计算
查看>>
iOS: Block的循环引用
查看>>
变量声明提升1
查看>>
树莓派下实现ngrok自启动
查看>>
通过XAML Islands使Windows桌面应用程序现代化
查看>>
Javascript 深入浅出原型
查看>>
Magento XML cheatsheet
查看>>