详解C++编程中对二进制文件的读写操作

2020-01-06 13:50:15刘景俊

上面第一行中的a是输出文件流对象,write函数将字符指针p1所给出的地址开始的50个字节的内容不加转换地写到磁盘文件中。在第二行中,b是输入文件流对象,read 函数从b所关联的磁盘文件中,读入30个字节(或遇EOF结束),存放在字符指针p2所指的一段空间内。

[例] 将一批数据以二进制形式存放在磁盘文件中。

 

 
  1. #include <fstream>  using namespace std; 
  2. struct student  { 
  3. char name[20];  int num; 
  4. int age;  char sex; 
  5. };  int main( ) 
  6. {  student stud[3]={"Li",1001,18,'f',"Fun",1002,19,'m',"Wang",1004,17,'f'}; 
  7. ofstream outfile("stud.dat",ios::binary);  if(!outfile) 
  8. {  cerr<<"open error!"<<endl; 
  9. abort( );//退出程序  } 
  10. for(int i=0;i<3;i++)  outfile.write((char*)&stud[i],sizeof(stud[i])); 
  11. outfile.close( );  return 0; 

用成员函数write向stud.dat输出数据,从前面给出的write函数的原型可以看出: 第1个形参是指向char型常变量的指针变量buffer,之所以用const声明,是因为不允许通过指针改变其指向数据的值。形参要求相应的实参是字符指针或字符串的首地址。现在要将结构体数组的一个元素(包含4个成员)一次输出到磁盘文件stud.dat。&tud[i] 是结构体数组第i个元素的首地址,但这是指向结构体的指针,与形参类型不匹配。因此 要用(char *)把它强制转换为字符指针。第2个参数是指定一次输出的字节数。sizeof (stud[i])的值是结构体数组的一个元素的字节数。调用一次write函数,就将从&tud[i]开始的结构体数组的一个元素输出到磁盘文件中,执行3次循环输出结构体数组的3个元素。