c++中的文件流处理(tellg()函数)

filestream processing in c++(tellg() function)

本文关键字:函数 tellg 处理 文件 c++      更新时间:2023-10-16

我编写了以下代码。。。。

#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"的输出。。。为什么会这样

您观察到的行为与许多其他C++新手相同。例如阅读这个问题。

发生的情况是,在您尝试从in读取某些内容后,in.eof()被设置为true,但由于没有更多数据,操作失败。当读取操作由于文件结束而失败时,它会同时设置eofbitfailbit。当流处于失败状态时,会记录tellg函数以返回-1

要解决此问题,请在执行读取操作之后测试eof,并在执行其他操作之前测试。更好的是,检查操作是否"失败",因为你不想区分文件结尾和错误输入(例如,如果输入的是字符串而不是余额的数字,你的代码将进入无限循环):

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

CCD_ 9条件检查是否设置了CCD_ 10或CCD_。您可以通过重写为:来简化此过程

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