关于c++文件指针的几点值得思考的问题

首先创建文件:

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;
}
  1. 打开文件后的读取指针和写指针的默认位置

    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()

    得到的结果为:

     

  2. 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无影响

  3. 尝试将指针指到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())就会一直循环下去。

 

 

怎么会有这么多智障的操作呀。。。。不想整理了,自己试试吧。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值