我写了以下代码......
#include< iostream>
#include< fstream>
using namespace std;
int main()
{
ifstream in("text1.dat",ios::in);
enum choice{zero=1, credit, debit, exit};
choice your;
int balance;
char name[50];
int option;
while(cin>>option)
{
if(option==exit)
break;
switch(option)
{case zero:
while(!in.eof())
{in>>balance>>name;
if(balance==0)
cout<<balance<<" "<<name<<endl;
cout<<in.tellg()<<endl;
}
in.clear();
in.seekg(0);
break;}
// likewise there are cases for debit and credit
system("pause");
return 0;
}
在text1.dat中,条目为:
10 avinash
-57 derek
0 fatima
-98 gorn
20 aditya
,输出结果为:
1 //i input this
16
27
0 fatima
36
45
55
-1 //(a)
3 //i input this
10 avinash
16
27
36
45
20 aditya
55
20 aditya //(b)
-1
我的问题是:
答案 0 :(得分:2)
您正在观察与许多其他新手C ++程序员相同的行为。请阅读this question。
在尝试从in.eof()
读取内容之后,true
设置为in
会发生什么情况,操作失败,因为没有更多内容数据。当读取操作因文件结束而失败时,它会将,eofbit
和failbit
设置为。当流处于失败状态时,会记录tellg
函数以返回-1
。
要解决此问题,请在执行读取操作后测试eof
,然后在之前测试。更好的是,检查操作是否“失败”,因为您不想区分文件结尾和错误输入(例如,如果输入字符串而不是余额的数字,则代码进入无限循环):
for(;;)
{
in>>balance>>name;
if(!in)
break;
if(balance==0)
cout<<balance<<" "<<name<<endl;
cout<<in.tellg()<<endl;
}
!in
条件检查是否设置了failbit
或badbit
。您可以通过重写为:
while(in>>balance>>name)
{
if(balance==0)
cout<<balance<<" "<<name<<endl;
cout<<in.tellg()<<endl;
}