代码
1 2 3 4 5 6 7 8 9 10 11 12
| while(!in.eof()){ in >> tmp; //in是ifstream的对象 cout << "temp:" << tmp << endl; if(count % 2 != 0){ w[wIndex] = tmp; wIndex++; }else{ v[vIndex] = tmp; vIndex++; } count++; }
|
这里出来的结果是这样的
1 2 3 4 5 6 7
| temp:26 ... ... temp:83 temp:17 temp:48 //这个是文件结尾最后一个数 temp:48 //但是这里却出现了两次,证明有错(有些编译器会报错)
|
解决方法
- 在循环之前先读入一个数据
- 把读取数据的操作放在循环的最后
1 2 3 4 5 6 7 8 9 10 11 12 13
| in >> tmp; while(!in.eof()){ cout << "temp:" << tmp << endl; if(count % 2 != 0){ w[wIndex] = tmp; wIndex++; }else{ v[vIndex] = tmp; vIndex++; } count++; in >> tmp; }
|
原因
这是因为判断文件是否结束的eof()函数是根据读入的字符判断的
比如:假定文件后面是17 48 文件结束标志
3个数据(假设是最后的三个数据),现在已经读到48(in >> tmp
已经执行),到!in.eof()
的时候,因为读入的不是文件结束标志,所以循环继续,再一次执行in >> tmp
,读取的时候文件结束标记,如果后面还有一些操作包含这个tmp的话,有可能会报错。
1 2 3 4
| while(!in.eof()){ in >> tmp; //这里下面还有各种操作blabla }
|
优化为:
1 2 3 4 5
| in >> tmp; while(!in.eof()){ //这里下面还有各种操作blabla in >> tmp; }
|
这样最后执行in >> tmp
的时候就会读到文件结束标记,然后刚好有!in.eof()
判断。