-1

私は次のコードを書きました....

#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  

私の質問は次のとおりです。

  1. 'a' とマークされた出力は -1 です... tellg() の出力として -1 とはどういう意味ですか?
  2. 「b」とマークされた出力が繰り返されます...なぜそうなのですか?
4

1 に答える 1

2

あなたは他の多くの初心者のC++プログラマーと同じ振る舞いを観察しています。たとえば、この質問を読んでください。

何が起こるかというと、何かを読み込もうとした後、データがなくなったために操作が失敗したin.eof()に設定されます。ファイルの終わりが原因で読み取り操作が失敗すると、との両方が設定されます。ストリームが失敗状態の場合、関数はを返すように文書化されています。true ineofbitfailbittellg-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;
}
于 2011-07-01T19:18:39.107 に答える