【问题标题】:filestream processing in c++(tellg() function)C ++中的文件流处理(tellg()函数)
【发布时间】:2011-06-28 14:35:15
【问题描述】:

我写了以下代码....

#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”的输出重复...为什么会这样?

【问题讨论】:

  • 代码 + 输出 + 为什么? != 好问题
  • @balki 解释太短了...我知道失败返回-1,但我已经提出条件,当遇到 EOF 时,循环将终止...但你甚至可以看到之后55 是输出(即在将包含 aditya 的语句输入到流中之后)循环不会终止,但会再提供一个输出 -1 ......当我输入 3 时重复同样的事情......最重要的是我问了两个问题...在否决我之前,你应该已经满意地回答了这两个问题

标签: c++ file-processing


【解决方案1】:

您观察到的行为与许多其他 C++ 新手程序员相同。例如阅读this question

发生的情况是in.eof() 设置为true您尝试从in 读取某些内容并且操作失败,因为没有更多数据。当读取操作因文件结束而失败时,它会设置 botheofbitfailbit。当流处于失败状态时,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;
}

【讨论】:

  • @avinash:您的第二个问题无法回答,因为我们没有debit 的代码。
  • 借方和贷方的代码完全相同为零......唯一的区别是借方我们检查 if(balance>0) 和贷方我们检查 if(balance
  • @avinash:至少要正确格式化您的问题,否则无法阅读。你的第二个问题的答案是一样的。即使由于 EOF 导致操作失败,您也可以打印这些值。但是当操作失败时,旧值不会改变,因此会重复读取最后一行。
猜你喜欢
  • 1970-01-01
  • 2019-04-12
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多