c++中的文件流处理(tellg() 函数)
我写了以下代码...
#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
我的问题是:
- 标记为“a”的输出是-1...-1作为tellg()的输出意味着什么?
- 标记为“b”的输出被重复...为什么会这样?
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:
10 avinash
-57 derek
0 fatima
-98 gorn
20 aditya
and the output was:
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:
- the output marked 'a' is -1...what does -1 mean as an output of tellg()?
- the output marked 'b' is repeated...why so?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您观察到的行为与许多其他新手 C++ 程序员相同。例如,阅读这个问题。
发生的情况是,在您尝试从
in
in.eof() 设置为true
> 并且操作失败,因为没有更多数据。当读取操作由于文件结束而失败时,它会设置 both、eofbit
和failbit
。当流处于失败状态时,tellg
函数会返回-1
。要解决此问题,请在执行读取操作之后、执行其他操作之前测试
eof
。更好的是,检查操作是否只是“失败”,因为您不想区分文件结尾和不正确的输入(例如,如果输入的是字符串而不是余额数字,则您的代码会输入一个无限循环):!in
条件检查是否设置了failbit
或badbit
。您可以通过重写来简化它:You are observing the same behavior as many other novice C++ programmers. Read for example this question.
What happens is that
in.eof()
is set totrue
after you've tried to read something fromin
and the operation failed because there was no more data. When a read operation fails due to end-of-file, it sets both,eofbit
andfailbit
. When a stream is in fail state, thetellg
function is documented to return-1
.To solve the problem, test for
eof
after you perform a read operation and before you do anything else. Even better, check that the operation just 'failed', since you don't want to distinguish between an end-of-file and an incorrect input (e.g. if a string is fed instead of an number for the balance, your code enters an infinite loop):The
!in
condition checks that eitherfailbit
orbadbit
are set. You can simplify this by rewriting as: