c++中的文件流处理(tellg()函数)
filestream processing in c++(tellg() function)
我编写了以下代码。。。。
#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"的输出。。。为什么会这样
您观察到的行为与许多其他C++新手相同。例如阅读这个问题。
发生的情况是,在您尝试从in
读取某些内容后,in.eof()
被设置为true
,但由于没有更多数据,操作失败。当读取操作由于文件结束而失败时,它会同时设置、eofbit
和failbit
。当流处于失败状态时,会记录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;
}
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 为什么函数 tellg() 没有返回好的结果?
- 查找二进制文件的大小,函数 tellg() 返回 -1
- 我似乎不明白tellg函数的工作原理
- c++中tellg()函数的奇怪行为
- c++中的文件流处理(tellg()函数)
- tellg()函数给出了错误的文件大小