最近在做C++的大作业中的小作业,用到文件的地方很多。我也不是第一次用了,但是很久不用就是这么不熟悉,时常会忘记很多细节。今天就在这里总结一下。
1.文件的输入
ifstream fp_account("input.txt");
if(!fp_account) //若打开失败
{
cout<<"input opens failed!"<<endl;
return 0;
}
int i=0;
string in;
while(fp_account.peek()!=EOF)//????????????????
{
getline(fp_account,in);//不用吃换行符!
file[i].setBankName(in);
.......
}
.......
今天在调试的时候发现文件怎么都读不进string in。后来经过各种排查,才发现文件打开失败了。我很少遇到这样的问题,所以在一开始没有写文件打开失败的处理。结果这一偷懒耽误了我太多时间。最后我找到打开失败的原因时已经呵呵了:那个文件是input.txt.txt,图形化显示的时候没显示后缀,我把.txt当后缀了,其实人家是名字!!!
还有就是getline的问题。对于各种读取字符、字符串的操作,换行符会不会被丢弃是个很重要的细节,每次用的时候我都会查。我之前查到说getline(cin,str)是读到换行符为止。后来发现其实是把换行符吃掉了。
2.文件末尾的判断
今天发现了一个好函数,叫fp.peek()。它的作用是在输入流中读取一个字符,若它不是EOF则放回缓冲区,若是则跳出。用起来就像这样:while(fp_account.peek()!=EOF).
本来我用的是while(!fp_account.eof()),但它会多循环一次。因为“在这里,大家可能有一个误区,认为eof()返回true时是读到文件的最后一个字符,其实不然,eof()返回true时是读到文件结束符0xFF,而文件结束符是最后一个字符的下一个字符[1]。”
参考:
[1]http://larrycheung.blog.163.com/blog/static/1317296612011474934348/