zoukankan      html  css  js  c++  java
  • 读写文件时0A转化为0D 0A

    转自:http://www.cnblogs.com/congdiaodiao/p/4529785.html

    用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是换行,也就是 ,再想想,Windows系统下的换行是如何处理的? 啊。原来……

    原来按照字节流的形式输出文本时,ofstream会自动将输出的 变成 ,以适应WIndows系统,结果以输出数据的角度看来,这个正常的举动就变成了不可解的“0A变成0D 0A”。

    既然如此,答案也出来了,查查文档,将打开文件的一句改成:
    fout.open("d:\test.dat", ios_base::out | ios_base::binary);
    捣乱的0A终于归位了。

  • 相关阅读:
    项目用到的分页功能(保存)
    跟上脚步(微信小程序)
    啊!!!贾克斯。
    Javascript闭包——懂不懂由你,反正我是懂了(作者: FrankFang 来源: 博客园)
    OpenCV4Android 之 OpenCV4Android SDK
    OpenCV4Android 之 Android 开发简介
    (-2147483648 > 0)?
    基于能量水平的无线传感器网络拓扑控制研究
    遍历文件夹及其子孙文件夹中的文件
    目标检测中背景建模方法
  • 原文地址:https://www.cnblogs.com/zhengfa-af/p/8258649.html
Copyright © 2011-2022 走看看