[英]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:我的问题是:
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
.当读取操作由于文件结束而失败时,它会同时设置eofbit
和failbit
。 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
条件检查是否设置了failbit
或badbit
。 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.