随机访问二进制文件问题

来源:百度知道 编辑:UC知道 时间:2024/05/30 12:17:06
// Note:Your choice is C++ IDE
#include <iostream>
#include <fstream>
using namespace std;
struct student
{
int num;
char name[20];
float score;
};

int main()
{
student stud[5]={1001,"Li",85,1002,"Fun",97.5,1004,"Wang",54,1006,"Tan",76.5,1010,"ling",96};
fstream iofile("studl.dat",ios::in|ios::out|ios::binary);
if(!iofile)
{
cerr<<"open error!"<<endl;
abort();
}
for(int i=0;i<5;i++)
iofile.write((char *)&stud[i],sizeof(stud[i]));
student studl[5];
for(int i=0;i<5;i=i+2)
{
iofile.seekg(i*sizeof(stud[i]),ios::beg);
iofile.read((char *)&studl[i/2],sizeof(studl[0]));
cout<<studl[i].num<<" "<<studl[i].name<<" "<<studl[i/2].score<<endl;
}
cout<<endl;
stud[2]

1. 如果你在VC6下编译,那么会提示你i重复定义,但如果在vs2005,vs2008下编译则不会。原因是VC6对新的标准不支持。在新标准下,for循环中定义的变量作用域只是该循环。

2. 因为你使用打开该文件用于读写,所以该文件必须存在,否则if(!iofile)
{
cerr<<"open error!"<<endl;
abort();
}
就会报错。

另外,注意cout<<studl[i].num<<" "<<studl[i].name<<" "<<studl[i/2].score<<endl;
语句中下标的一致。

将i在main函数一开始就定义,删除两个for循环语句中i前的int类型符号。你的错误不是什么i的生命周期的问题,而是你忘了在使用变量i之前应先定义变量i。你混淆了下面两个问题:

问题一:在for循环体中可以定义变量且其生命周期仅局限在循环内,例如:
for(i=1;i<10;i++)
{ int k; // 此处k是局部变量,且生命周期仅在循环内
k=3;
printf("%d",k*i);
}
问题二:for(int i=1;i<10;i++) 这种写法是错误的,不能在for循环括号里定义变量i,for循环使用的变量i一定是在main中事先定义好才能用的。

1. for循环中的i的生命周期在整个main函数中都有效。
2. 肯定是打开文件失败,输出的是原数组的内容和内存中乱码。