2011-06-28 46 views
-1

我寫下面的代碼....FILESTREAM處理

#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 ... -1表示tellg()的輸出是什麼意思?
  2. 標記'b'的輸出重複......爲什麼這樣呢?
+0

這是一些失敗。 http://www.cplusplus.com/reference/iostream/istream/tellg/ – balki

+2

代碼+輸出+爲什麼? !=好SO問題 – AJG85

+0

@balki太短解釋...我知道失敗返回-1,但我已經把條件,當EOF面臨循環將終止...但你可以看到,即使55後是輸出(即在包含aditya的語句被輸入到流中之後)循環不會終止,但會給出一個更多的輸出-1 ...並且當我輸入3時重複相同的操作...並且最重要的是我問了兩個問題。 ..u應該已經回答了令人滿意的問題,然後再投降我 – avinash

回答

2

您正在觀察與許多其他新手C++程序員相同的行爲。請閱讀例如this question

會發生什麼事是in.eof()設置爲true後,你一直在努力,讀取in東西,操作失敗,因爲沒有更多的數據。當由於文件結束而導致讀操作失敗時,它會設置,eofbitfailbit。當一個流處於失敗狀態時,tellg函數被記錄爲返回-1

要解決此問題,請在執行讀操作後測試eof,在之前測試,然後執行其他操作。更好的辦法是檢查操作是否失敗,因爲你不想區分文件結束和不正確的輸入(例如,如果一個字符串被輸入而不是天平的數字,你的代碼就會進入無限循環):

for(;;) 
{ 
    in>>balance>>name; 
    if(!in) 
    break; 
    if(balance==0) 
    cout<<balance<<" "<<name<<endl; 
    cout<<in.tellg()<<endl; 
} 

!in條件檢查,要麼failbitbadbit被設置。您可以通過將其重寫爲:

while(in>>balance>>name) 
{ 
    if(balance==0) 
    cout<<balance<<" "<<name<<endl; 
    cout<<in.tellg()<<endl; 
} 
+0

@ybungalobill ..... thanx我的第一個問題是回答....但我的第二個問題? – avinash

+0

@avinash:你的第二個問題是不可能回答的,因爲我們沒有'debit'的代碼。 – ybungalobill

+0

借方和貸方的代碼是完全一樣的零...唯一的區別是,借方我們檢查是否(餘額> 0)和信用我們檢查是否(餘額<0)....我做了一個觀察哪些可以幫助你......當我把aditya放在文本文件中時,aditya被重複了......最初我已經把gorn放在最後,然後當我按下2(credit =負平衡)derek被輸出一次,然後重複2次 – avinash