现在的位置: 首页 > 综合 > 正文

二进制文件读写附加信息

2013年08月07日 ⁄ 综合 ⁄ 共 1723字 ⁄ 字号 评论关闭

1.前述:
 1)因为是要对二进制文件进行读写操作,所以比如在文件打开的时候以 'b'方式(二进制方式)打开。
 2)用这种方式,可以在多个进程在通过该二进制文件读取内容,比如从一PC保存内容后该二进制文件转移到另一PC下使用时可以获取该内容。

2.例子:追加写入读取二进制文件内容
 
 1)声明
 struct TestStruct
 {
  char *szText;
  int nLength;
  .......       
 }

 2)写入
  
 TestStruct aTest;
 memset(&aTest, 0, sizeof(TestStruct));
 
 {初始化aTest......}
  
 //以二进制方式打开文件,并这
 FILE *fStream = fopen(szFileName, 'ab');
 
 //获取结构内容的长度 
 int nWriteLength = sizeof(TestStruct);      
 
 //写入内容,一个该内容的需要nWriteLength长度的空间
 fwrite(aTest, nWriteLength, 1, fStream);
 
 //记录内容的长度进文件,用来在读取时获取内容
 fwrite(&nWriteLength, sizeof(int), 1, fStream);
 
 fclose(fStream);

 fStream = NULL;

 3)读取

 TestStruct aTest;
 memset(&aTest, 0, sizeof(TestStruct));
 
 //开打文件
 FILE *fStream = fopen(szFileName, 'rb');
 
 //记录需要读出的二进制内容长度
 int nConfigLen = 0;
 
 //跳转到文件的最后一个内容(刚才写入的时候是以 sizeof(int) 容量写入了一个 int)
     fseek(fStream, 0-sizeof(int), SEEK_END);
 
 //从文件末尾读取一个int(需要获取的信息内容长度)
     fread(&nConfigLen, sizeof(int), 1, fStream);

     // 申请内存
     char *buf = new char[nConfigLen+1];
     memset(buf, 0, nConfigLen+1);

     // 移动文件指针至需要读取的信息的起始处
     fseek(fStream, 0-sizeof(int)-nConfigLen, SEEK_END);

     // 读取信息
     fread(buf, 1, nConfigLen, fStream);

     fclose(fStream);

 fStream = NULL;
 
 //将获取出来的二进制内容拷贝给我们需要的结构
 memcpy(aTest, buf, szieof(TestStruct));
 
 //不要忘记删除分配的堆空间
 delete [] buf;

3.例子的流程详解
 1)例子对二进制文件的操作结构图
 

//................................................................//(->原文件的结束)[XXXXXXXX]((1)我们加入的内容)[int]((2)加入内容的长度){文件的结束}

  (1)下的内容都是追加的二进制信息。
  (2)是追加内容的长度,用来确定读取的内容到底多少合适。 
 
 2)写入的流程:
  (1)写入内容,该内容单位一个所占的空间大小。
  (2)保存所写入的内容内所占的空间长度。

 3)读取的流程:
  (1)指针定位到最后一个内容。(该内容为写入的内容内所占的空间长度的信息)[0-sizeof(int):因为是从后向前偏移,所以用负值]
  (2)先读出最好一个保存写入的内容内所占的空间长度的信息。
  (3)根据长度信息定位到内容起始位置。
  (4)读取内容,保存在足够的 char[] buf 空间中。
  (5)用memcpy 方式将 buf 的内容拷贝给需要的参数即可。
   
 4)这种传值方法是一种通用内容传递方法,不管是从文件到文件的内容读写,还是socket, NamePipe 等,都可以用来传递非标准类型内容。 

抱歉!评论已关闭.