简体   繁体   English

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

[英]filestream processing in c++(tellg() function)

i wrote the following code....我写了以下代码....

#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;   
}    

In text1.dat the entry was:在 text1.dat 中,条目是:

10 avinash  
-57 derek  
0 fatima  
-98 gorn  
20 aditya

and the output was: output 是:

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  

my questions are:我的问题是:

  1. the output marked 'a' is -1...what does -1 mean as an output of tellg()?标记为“a”的 output 是 -1 ... -1 是什么意思,作为tellg()的 output?
  2. the output marked 'b' is repeated...why so?标记为“b”的 output 重复......为什么会这样?

You are observing the same behavior as many other novice C++ programmers.您正在观察与许多其他新手 C++ 程序员相同的行为。 Read for example this question .例如阅读这个问题

What happens is that in.eof() is set to true after you've tried to read something from in and the operation failed because there was no more data.发生的情况是in.eof()在您尝试从in读取某些内容设置为true并且操作失败,因为没有更多数据。 When a read operation fails due to end-of-file, it sets both , eofbit and failbit .当读取操作由于文件结束而失败时,它会同时设置eofbitfailbit When a stream is in fail state, the tellg function is documented to return -1 .当 stream 失败 state 时, tellg function 记录为返回-1

To solve the problem, test for eof after you perform a read operation and before you do anything else.要解决此问题,请在执行读取操作之后和执行任何其他操作之前测试eof Even better, check that the operation just 'failed', since you don't want to distinguish between an end-of-file and an incorrect input (eg if a string is fed instead of an number for the balance, your code enters an infinite loop):更好的是,检查操作是否“失败”,因为您不想区分文件结尾和不正确的输入(例如,如果输入字符串而不是余额的数字,您的代码会输入无限循环):

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

The !in condition checks that either failbit or badbit are set. !in条件检查是否设置了failbitbadbit You can simplify this by rewriting as:您可以通过重写为:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM