2011-06-28 5 views
-1

iはtext1.datエントリに次のコード....ファイルストリーム処理は

#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; 
}  

を書いた

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です... -1はtellg()の出力として何を意味しますか?
  2. 'b'とマークされた出力が繰り返されます...なぜそうですか?
+0

これは、次のように書き換えて簡単にすることができます。 http://www.cplusplus.com/reference/iostream/istream/tellg/ – balki

+2

コード+出力+なぜですか? !=良いSOの質問 – AJG85

+0

@balkiは説明が短すぎます...私は失敗が-1を返すことを知っていますが、私はEOFが直面するループが終了する...しかし、あなたが55後にも見ることができる条件を置いている出力(それはステートメントを含むステートメントがストリームに入力された後です)ループは終了せず、もう1つの出力を与えます-1 ... 3を入力すると同じことが繰り返されます。 ..uは私を下降させる前に両方とも満足に答えるべきだった – avinash

答えて

2

他の多くの初心者のC++プログラマと同じ動作が観察されています。たとえば、this questionを読んでください。何が起こる

in.eof()はあなたがinから何かを読み取るために試してみた後trueに設定し、それ以上のデータがなかったため、操作が失敗したということです。ファイルの終わりのために読み取り操作が失敗すると、,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; 
} 
+0

@ybungalobill ..... thanx私の最初の質問に答える....しかし、私の2番目の質問? – avinash

+0

@avinash:2番目の質問は、私たちが 'デビット 'のコードを持っていないので答えることができません。 – ybungalobill

+0

デビットとクレジットのコードは全く同じです...唯一の違いは、デビットでは(残高> 0)、クレジットについては(残高<0)をチェックしています。あなたが私を2回押したとき(クレジット=マイナスバランス)デレクが一度だけ出力されたときgornが2回繰り返されました – avinash

関連する問題