python/c/c++バイナリファイル読み書き


1.pythonバイナリファイルの読み書き
バイナリファイルの読み書きのみを議論します.ファイルをバイナリ形式で開く
with open(filename , 'wb') as fd :
     #do with fd
     fd.write(strobject)#   strobject    
     fd.read(byte_len)#  byte_len    

wb:ファイルrbをバイナリで開くことを示す:ファイルrbをバイナリで読むことを示す
2.進数変換について
structを使用して、バイナリ文字列または対応するデパッケージメタグループにパッケージ化する必要があります.
#  format  ,      v1,v2,...         
byte_objects = struct.pack(format,v1,v2,...)

#  format  , buffer      ,         
value_tuple = struct.unpack(format,buffer)

3.いくつかのデータ型の例を読み書きする
#    
with open('test.data','wb') as fd:
    i = 1
    bi = struct.pack('i',i) #'i'   int      
    fd.write(bi)
    f = 2.1
    bf =  struct.pack('f',f) #'f'   float      
    fd.write(bf)
    d = 3.1
    bd =  struct.pack('d',d) #'d'   double      
    fd.write(bd)
    l = 4L
    bl =  struct.pack('l',l)#'l'   long      
    fd.write(bl)


#    
with open('test.data','rb') as fd:
    byte_len = 4
    bi = fd.read(byte_len) #  int   4         
    print struct.unpack('i',bi) #      int  

    bf = fd.read(byte_len) #  float   4         
    print struct.unpack('f',bf) #      float  

    byte_len = 8
    bd = fd.read(byte_len) #  double   8         
    print struct.unpack('d',bd) #      double  

    bl = fd.read(byte_len) #  long   8         
    print struct.unpack('l',bl)#      long  

C/C++のデータ型pythonに対応するデータ型とバイトサイズについては、以下のサイトを参照してください.https://docs.python.org/3/library/struct.html#format-characters
4.c++python生成ファイルの読み取りについてテストする
/**c++ ifstream**/
void readifstream(const char* filename){
    cout << "ifstream " << endl;
    ifstream ifs(filename,ifstream::binary);
    if(!ifs){
        cerr << "open file error " << endl;
        exit(0);
    }
    int i;
    float f;
    double d;
    long l;
    ifs.read((char*)&i,sizeof(i));
    ifs.read((char*)&f,sizeof(f));
    ifs.read((char*)&d,sizeof(d));
    ifs.read((char*)&l,sizeof(l));
    ifs.close();
    cout <<"i="<< i << " f="<< f <<" d="<< d <<" l=" << l << endl;
    cout << "==============cout======================" << endl;
}

/**c FILE*/
void readFILE(const char* filename){
    printf("readFILE
"
); FILE * fid = fopen(filename,"rb"); if(!fid){ perror("open file error
"
); exit(0); } const int size = 1; int i; float f; double d; long l; fread((char*)&i,sizeof(i),size,fid); fread((char*)&f,sizeof(f),size,fid); fread((char*)&d,sizeof(d),size,fid); fread((char*)&l,sizeof(l),size,fid); fclose(fid); printf("i=%d f=%.2f d=%.2lf l=%ld
"
,i,f,d,l); printf( "================printf====================
"
); }