2011-06-28 40 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