• 文件读写


    <字节对齐与大小端>
    (1)对于大小端转换,可以使用以下函数:
     
    1 //对应int32大小的成员 的转换 范例 
    2 int swapInt32(int value)
    3 {
    4     return ((value & 0x000000FF) << 24) |
    5         ((value & 0x0000FF00) << 8) |
    6         ((value & 0x00FF0000) >> 8) |
    7         ((value & 0xFF000000) >> 24);
    8 }
    (2)字节对齐:
     
    #pragma pack(push) //保存对齐状态 
    #pragma pack(1)//设定为1字节对齐 
    struct newTest{    
        char bParam;
        int aParam;
    };
    #pragma pack(pop)//恢复对齐状态 
    对比python,其字节对齐和大小端的设置,都可以通过ctypes库实现
    1 class chooseStructure(ct.LittleEndianStructure):#小端结构体
    2 _pack_ = 1 #字节对齐
    3 _fields_ = [
    4 ("chooseFre",ct.c_float*4)
    5 ]
    一、C语言对文件读写的支持
    写入二进制文件:
    1 int a = 10;
    2 FILE *pFile = fopen("1.dat","wb");
    3 fwrite(&a,sizeof(int),1,pFile);
    4 fclose(pFile);
    读取二进制文件:
    1 newTest ntest;//为上面定义的结构体
    2 pFile = fopen("1.dat", "rb");
    3 fread(&ntest,sizeof(newTest),1,pFile);
    4 fclose(pFile);
    注意:文件读写,对于二进制文件的读写,一定要使用rb/wb/ab/rb+/wb+/ab+!
    和文本文件区分开来!
     
    如果不使用fclose,数据先存到缓冲区里面,不能立即存到磁盘文件中,但是如果fclsoe之后,如果再想操作文件,需要重新fopen,所以,可以使用另一个C函数:fflush。该函数作用是将缓冲区中的数据写到磁盘文件中。
    fflush适用于不断读写文件的情况,而每次新的读写,如果需要指定写入文件的位置,需要使用函数fseek。
    例子:
    1 FILE *pFile = fopen("1.txt", "w+");
    2 char buf[22] = "asdf";
    3 fwrite(buf,1,22,pFile);
    4 fflush(pFile);
    5 fseek(pFile,0,SEEK_SET);//一定要调整文件指针的位置
    6 char ch[100];
    7 fread(ch,1,100,pFile);
    8 fclose(pFile);
    9 cout << ch;
    如上为正确的读写过程,需要注意的地方:
    (1) w+和r+都为可读可写,但是r+读的时候如果没有该文件就会报错
    (2) 从缓冲区写到磁盘文件后,要通过fseek调整文件指针到第一个位置,才能保证后面读的时候从头读
     
    但是上面的方法存在的问题是:有时候不知道文件大小,字符数组的大小需要灵活设置。
     
     1 FILE *pFile = fopen("1.txt", "r");
     2 char *pBuf;
     3 fseek(pFile,0,SEEK_END);
     4 //ftell文件位置指针当前位置相对于文件首的偏移字节数
     5 long len = ftell(pFile);
     6 pBuf = new char[len+1];
     7 rewind(pFile);
     8 fread(pBuf,1,len,pFile);    
     9 pBuf[len] = 0;
    10 fclose(pFile);
    11 cout << pBuf;
     
    至于说出现乱码,首先,写入字符串的时候,因为要由这样一位作为结束符,所以,定义数组长度的时候,要多一位,fwrite的长度也要保留出那一位结束字符!!!或者使用strlen("xxxx")+1
     
    ---------------------------
    python调用c接口,实现对二进制文件操作
    对于python来说,其内置函数open()/file()可以对文件进行操作。
    但是由于对于弱类型的python语言来说,其没有int、char、short等不同字节存储的支持,并且读取文件read()函数,返回str类型的数据。
    所以想要像c/c++那样操作二进制文件数据,对于python来说,会有一些麻烦。操作方法有很多,其中包括:
    (1)struct模块
    通常使用python中的第三方库struct函数,来对读取的str类型进行转换
    譬如:
    写入:
    1 import ctypes as ct
    2 num = ct.c_int32(12)
    3 f = open("1.dat","wb")
    4 f.write(num)
    5 f.close()
    解析:
    1 import struct
    2 f = open("1.dat","rb")
    3 s = f.read()
    4 f.close()
    5 i = struct.unpack('i',s)
    6 print i
    其中,写入文件为‘x0Cx00x00x00’
    解析后的i为(12,)(返回一个元组)
    (2)ctypes模块
    利用内存操作
    1 t = ct.c_int32() 2 ct.memmove(ct.byref(t),s,len(s)) 3 print t 
    解析后得到t为 ct.c_long(12)
     
    所以,通过python读取二进制文件的时候,需要进一步操作,才能得到int、char、short等,以及其他结构的数据。
     
    ---------------------------
     

    二、利用C++对文件读写的支持

    写入文件用ofstream函数
    读取文件使用ifstream函数
    利用C++操作文件场合比较少,这里不再研究
     

     

     
     
     

    作者:禅在心中

    出处:http://www.cnblogs.com/pinking/

    本文版权归作者和博客园共有,欢迎批评指正及转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    1869六度分离
    1162Eddy's picture
    hdu2544
    3549Flow Problem
    1272小希的迷宫
    2112HDU Today(Dijkstra)
    1878欧拉回路
    hdu1116Play on Words
    2112HDU Today(SPFA)
    在程序中动态创建视图
  • 原文地址:https://www.cnblogs.com/pinking/p/6171087.html
Copyright © 2020-2023  润新知