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

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

将磁盘文件中的第,3,5个学生数据读入程序,并显示出来;

将第个学生的数据修改后存回磁盘文件中的原有位置。

从磁盘文件读入修改后的个学生的数据并显示出来。

要实现以上要求,需要解决个问题:

由于同一磁盘文件在程序中需要频繁地进行输入和输出,因此可将文件的工作方式指定为输入输出文件,即ios::in|ios::out|ios::binary。

正确计算好每次访问时指针的定位,即正确使用seekg或seekp函数。

正确进行文件中数据的重写(更新)。

可写出以下程序:

 

 
  1. #include <fstream>  using namespace std; 
  2. struct student  { 
  3. int num;  char name[20]; 
  4. float score;  }; 
  5. int main( )  { 
  6. student stud[5]={1001,"Li",85,1002,"Fun",97.5,1004,"Wang",54,1006,"Tan",76.5,1010,"ling",96};  fstream iofile("stud.dat",ios::in|ios::out|ios::binary); 
  7. //用fstream类定义输入输出二进制文件流对象iofile  if(!iofile) 
  8. {  cerr<<"open error!"<<endl; 
  9. abort( );  } 
  10. for(int i=0;i<5;i++) //向磁盘文件输出个学生的数据  iofile.write((char *)&stud[i],sizeof(stud[i])); 
  11. student stud1[5]; //用来存放从磁盘文件读入的数据  for(int i=0;i<5;i=i+2) 
  12. {  iofile.seekg(i*sizeof(stud[i]),ios::beg); //定位于第,2,4学生数据开头 
  13. //先后读入个学生的数据,存放在stud1[0],stud[1]和stud[2]中  iofile.read((char *)&stud1[i/2],sizeof(stud1[0])); 
  14. //输出stud1[0],stud[1]和stud[2]各成员的值  cout<<stud1[i/2].num<<" "<<stud1[i/2].name<<" "<<stud1[i/2].score<<endl; 
  15. }  cout<<endl; 
  16. stud[2].num=1012; //修改第个学生(序号为)的数据  strcpy(stud[2].name,"Wu"); 
  17. stud[2].score=60;  iofile.seekp(2*sizeof(stud[0]),ios::beg); //定位于第个学生数据的开头 
  18. iofile.write((char *)&stud[2],sizeof(stud[2])); //更新第个学生数据  iofile.seekg(0,ios::beg); //重新定位于文件开头 
  19. for(int i=0;i<5;i++)  { 
  20. iofile.read((char *)&stud[i],sizeof(stud[i])); //读入个学生的数据  cout<<stud[i].num<<" "<<stud[i].name<<" "<<stud[i].score<<endl;