首先创建文件:
int main()
{
char name1[8],name2[8],name3[8];
float score1=85.5,score2 = 90,score3 = 60;
strcpy(name1, "Antony");
strcpy(name2, "Jone");
strcpy(name3, "Tom");
fstream f;
f.open("D:\\recd.dat",ios::in|ios::out|ios::trunc);
if (!f)
{
cerr << "erro!" << endl;
exit(1);
}
f.write((char *)name1, 8 * sizeof(char));
f.write((char *)&score1, sizeof(float));
f.write((char *)name2, 8 * sizeof(char));
f.write((char *)&score2, sizeof(float));
f.write((char *)name3, 8 * sizeof(char));
f.write((char *)&score3, sizeof(float));
f.close();
return 0;
}
-
打开文件后的读取指针和写指针的默认位置
f.open("D:\\recd.dat",ios::in|ios::out|ios::binary); /********初始状态时文件流当前位置指针的默认位置*****/ cout << "没有任何对文件指针进行移动操作时:" << endl; cout << "f.tellg() = " << f.tellg() << endl; cout << "f.tellp() = " << f.tellp() << endl; f.close()
得到的结果为:
-
f.seekp()和f.seekg()操作的联系
/********验证f.seekp()和f.seekg()操作的联系*********/ f.seekp(3,ios::beg); f.seekg(6,ios::beg); cout << "经过 f.seekp(3,ios::beg) 和 f.seekg(6,ios::beg) 后:"<< endl; cout << "f.tellp() = " << f.tellp() << endl; cout << "f.tellg() = " << f.tellg() << endl;
不论是进行f.seekp()还是f.seekg()都会改变ios::cur,而对ios::beg和ios::end无影响
-
尝试将指针指到ios::end的后面会出现…
f.seekg(0,ios::end);
cout << "经过f.seekg(0,ios::end)后:" << endl;
cout << "f.tellg() = " << f.tellg() << endl;
f.seekg(6,ios::end);
cout << "经过f.seekg(6,ios::end)后:" << endl;
cout << "f.tellg() = " << f.tellg() << endl;
f.seekg(0,ios::end);//(再次验证ios::end的位置发现ios::end位置并没有发生改变)
cout << "经过f.seekg(0,ios::end)后:" << endl;
cout << "f.tellg() = " << f.tellg() << endl;
操作发现指针会指到ios::end之后且不改变ios::end,并且f.eof() == false;
4.尝试在ios::end的后面写入
/************尝试在ios::end之后写入*****/
long len = 8*sizeof(char) + sizeof(float);
cout << "len = " << len << endl;
f.seekp(len,ios::end);
cout << "经过f.seekp(len,ios::end)后:" << endl;
cout << "f.tellp() = " << f.tellp() << endl;
float score = 100;
char name[8];
strcpy(name,"Amy");
f.write((char *)name, 8 * sizeof(char));
f.write((char *)&score, sizeof(float));
f.seekg(0,ios::end);//(验证ios::end的位置发现ios::end位置是否发生改变)
cout << "经过f.seekg(0,ios::end)后:" << endl;
cout << "f.tellg() = " << f.tellg() << endl;
/************验证是否真的写入******************/
f.seekg(-len,ios::end);
f.read((char *)name1,8*sizeof(char));
f.read((char *)&score1,sizeof(float));
cout << name1 << '\t' << score1<< endl;
此时ios::end的位置发生改变,并且可以成功写入到文件中。
打开文件查看发现中间没有进行操作的部分,(即36到48的部分)存的是NUL
读取文件:
/********读取内容*************/
f.seekg(0,ios::beg);
f.read((char *)name,8*sizeof(char));
f.read((char *)&score,sizeof(float));
while(!f.eof())
{
cout << name << '\t' << score << endl;
f.read((char *)name,8*sizeof(char));
f.read((char *)&score,sizeof(float));
}
cout << "此时f.tellp()和f.tellg()的值为:"<< endl;
cout << "f.tellp() = " << f.tellp() << endl;
cout << "f.tellg() = " << f.tellg() << endl;
结果为:
当f.eof() == true之后f.tellp() 和 f.tellg == -1,无论怎么操作f.seekg()或f.seekp() ,f.tellg() 或 f.tellp() 值都为-1
5.尝试将指针指向ios::beg()之前
/************尝试将指针指向ios::beg之前*****/
f.seekg(-3,ios::beg);
cout << "经过f.seekg(-3,ios::beg())之后" << endl;
cout << "f.tellg() = " << f.tellg() << endl;
cout << "f.eof() = " << f.eof() << endl;
结果为:
无论你用f.seekp()或f.seekg()尝试将指针指向多前面,f.tellp()或者f.tellg()都是-1!
这个时候 f.eof() == false 但f.tellp() 和 f.tellg == -1,同f.eof() == true时一样无论再怎么操作f.seekg()或f.seekp() ,f.tellg() 或 f.tellp() 值都为-1!!!
所以无法进行write()或者read()。
不信你试试……
char name[8]= "";
float score = -1 ;
long len = 8*sizeof(char) + sizeof(float);
cout << "读入之前:" << endl;
cout << "name = " << name << ';' << "score = " << score <<endl;
f.seekp(-len,ios::beg);
f.read((char *)name,8*sizeof(char));
f.read((char *)&score,sizeof(score));
cout << "读入后:" << endl;
cout << "name = " << name << ';' << "score = " << score << endl;
cout << "f.tellg = " << f.tellg() << endl;
结果为:
说明指针在ios::beg之前时进行f.read()不能读取文件;
写入也是一样无法操作,不信你去试试。。。
因为你没有办法再移动文件流的读取指针或写指针了(即当前指针一直在-1处)所以f.eof()一直都是false。如果你不小心用了while(!f.eof())就会一直循环下去。
怎么会有这么多智障的操作呀。。。。不想整理了,自己试试吧。。