二进制文件读写附加信息

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 等,都可以用来传递非标准类型内容。 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值