注册 登录
编程论坛 C++教室

随机访问2进制文件的问题

lyj23 发布于 2011-05-08 09:02, 440 次点击
程序代码:
/* 有五个学生数据,要求:
(1)把它们放到磁盘文件中;
(2)把磁盘文件中的第1,3,5个学生的数据读入程序,并显示出来;
(3)将第3个学生的数据修改后存回磁盘文件中的原有位置。
*/
#include <conio.h>
#include <iostream>
#include <fstream>
using namespace std;
struct student
{

 int num;

 char name[20];

 float score;
};
int main()
{student stud[5]={1001,"LI",58,1002,"Fun",90,1003,"Da",96,1004,"Ma",78,1005,"Sa",98}
fstream iofile("stud.dat",ios::in|ios::out|ios::binary);
if(!iofile)
{

 cout<<"open error!"<<endl;

 getch();

 exit(1);
}
for(int i=0;i<5;i++)

 iofile.write((char*)&stud[i],sizeof(stud[i]));
student stud1[5];
for(int i=0;i<5;i=i+2)

 {iofile seekg(i*sizeof(stud1[i]),ios::beg);//下面的i/2是什么意思,为什么i/2以后就能到stud1中的,1,3,5号?
  iofile.read((char*)&stud1[i/2],sizeof(stud1[0]));
  cout<<stud1[i/2].num<<" "<<stud1[i/2].name<<" "<<stud1[i/2].score<<endl;

 }
cout<<endl;
stud2.num=1012;
strcpy(stud[2].name,"Wu");//这里一定要用复制函数,strcpy()?用stud[2].name="Wu";为什么不行?
stud[2].score=100;//我记得以前看到过原因,现在忘了。。高手指教
iofile.seekp(2*sizeof(stud[0]),ios::beg);
iofile.write((char *)&stud[2],sizeof(stud[2]));
iofile.seekg(0,ios::beg);
for(int i=0;i<5;i++)
{

 iofile.read((char *)&stud1[i],sizeof(stud[i]));

 cout<<stud[i].num<<" "<<stud[i].name<<" "<<stud[i].score<<" "<<endl;
}
iofile.close();
getch();
return 0;
}
4 回复
#2
fangdong652011-05-08 09:34
for(int i=0;i<5;i=i+2)
{iofile seekg(i*sizeof(stud1[i]),ios::beg);//下面的i/2是什么意思,为什么i/2以后就能到stud1中的,1,3,5号?
  iofile.read((char*)&stud1[i/2],sizeof(stud1[0]));
  cout<<stud1[i/2].num<<" "<<stud1[i/2].name<<" "<<stud1[i/2].score<<endl;
}
得到stud1中的1,3,5号与i/2无关而是与上两句有关,stud1[i/2]只是一个临时存储数据的变量,你也可以另行定义一个studtemp取代它,效果是一样的
字符串赋值不能用=号只能用strcpy(),对于数值型,字符型可以用=赋值
#3
lyj232011-05-08 09:55
程序代码:
for(int i=0;i<5;i=i+2)
{iofile seekg(i*sizeof(stud1[i]),ios::beg);//这里不是把指针定位于0,2,4学生数据开头吗?
iofile.read((char*)&stud1[i/2],sizeof(stud1[0]));//为什么这里写进去的1,3,5号的
  cout<<stud1[i/2].num<<" "<<stud1[i/2].name<<" "<<stud1[i/2].score<<endl;
}
#4
玩出来的代码2011-05-08 10:57
就没有下标5。、、是定位到0、2、4、读取的也是0、2、4号元素、
#5
lyj232011-05-08 18:21
哦,是题目。。0就是1,为了按照生活习惯把0看作1对吧!
1