обработка файлового потока в c ++ (функция Tellg ()) - PullRequest
0 голосов
/ 28 июня 2011

я написал следующий код ....

#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' повторяется ... почему так?

1 Ответ

2 голосов
/ 01 июля 2011

Вы наблюдаете то же поведение, что и многие другие начинающие программисты на С ++. Прочитайте, например, этот вопрос .

В результате 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...