社区
工具平台和程序库
帖子详情
在getline中重复使用ifstream的问题
hhmmdd
2003-06-03 01:41:37
void myread(ifstream *in)
{
in->seekg(0);
in->clear();
string s;
while(getline(*in,s,'\n'))
{
...
}
}
当ifstream打开文件后,第一次调用myread时,可以正常读出文件内容,但以后再调用myread就什么也读不出了。不知道问题出在哪里?
...全文
176
19
打赏
收藏
在getline中重复使用ifstream的问题
void myread(ifstream *in) { in->seekg(0); in->clear(); string s; while(getline(*in,s,'\n')) { ... } } 当ifstream打开文件后,第一次调用myread时,可以正常读出文件内容,但以后再调用myread就什么也读不出了。不知道问题出在哪里?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
19 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
hhmmdd
2003-06-03
打赏
举报
回复
我觉得应该是重载bool操作符,不知对也不对
给分
chinajiji
2003-06-03
打赏
举报
回复
if(in)又等价于:
if(in.good())
if(!in.fail() && !in.bad())
in.fail() == rdstate & failbit ;
fangrk
2003-06-03
打赏
举报
回复
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream input("abc.txt");
cout<<"Open file "<<(input.operator void*() ? "successfully":"failed");
}
DEV-C++ 和 Borland C++ Builder6通过,应该是通过operator void*() 得到状态的
chinajiji
2003-06-03
打赏
举报
回复
in.operator *( )
应该是:
in.operator void*( );
chinajiji
2003-06-03
打赏
举报
回复
当in.good == true 时,
if(in)等价于:
if(in.operator *( )) 此时,in.operator *( )返回值当然不会为0,所以又等价于:
if(true);
当in.good != true 时,
if(in)等价于:
if(in.operator *( )) 此时,in.operator *( )返回值当然为0,所以又等价于:
if(false);
之所以用in.operator *( ),而没有定义basic_ios::operator bool ( ) const;
是为了防止隐式类型转换带来意想不到的错误.
fangrk
2003-06-03
打赏
举报
回复
if(in)可能调用operator void*(),至于判断什么bit要回去翻书才知道,估计是failbit
if(in)有时候可以写成if(!in.fail())
hhmmdd
2003-06-03
打赏
举报
回复
实际myread是线程函数,所以用指针
hhmmdd
2003-06-03
打赏
举报
回复
最后一个问题
ifstream in;
if(in)实际判断的是哪个位?
完了就结帖
chinajiji
2003-06-03
打赏
举报
回复
函数参数中对文件对象,传引用比传指针好.
chinajiji
2003-06-03
打赏
举报
回复
failbit,当输入格式错,比如,输入字符到int变量里时,置1.
badbit,比如磁盘读写等物理错误时,置1.
其它两个不用说了吧.
fangrk
2003-06-03
打赏
举报
回复
eofbit是结束标志
failbit是失败标志,比如要求输入整数却输入了字符,遇到这种情况可以认为流状态还行,可以通过clear来消除
badbit是致命错误,不可挽回
goodbit就是状态良好
具体的去看C++标准程序库吧!我只是粗略的回忆写一下
hhmmdd
2003-06-03
打赏
举报
回复
ifstream里有多少标志位?eofbit failbit badbit goodbit都干什么的
ifstream in;
if(in)实际判断的是哪个位?
hhmmdd
2003-06-03
打赏
举报
回复
用楼上两位的方法都可以解决了,多谢
chinajiji(菜鸟叽叽) 、 fangrk(加把油,伙计!) 两位能再详细解释一下机理吗?
“seekg()只有当in->false()为false的时候有效“看不太懂
fangrk
2003-06-03
打赏
举报
回复
这个也行,clear要在seekg前面
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
void myread(ifstream *in)
{
in->clear();
in->seekg(0);
string s;
while(getline(*in,s,'\n'))
{
cout<<s<<endl;
}
}
int main()
{
ifstream input("abc.txt");
cout<<"First"<<endl;
myread(&input);
cout<<"Second"<<endl;
myread(&input);
}
我个人觉得函数的参数不是很好,我做的话会传入文件名void MyRead(const char* FileName);
你程序错误的原因是:
while(...){...}以后,in就设置了eofbit,必须先clear才能正确seekg
chinajiji
2003-06-03
打赏
举报
回复
hhmmdd (懵懂)
你的写法in->clear()相当于同有起作用.
因为getline()结束后in->false() == true;下一次进入函数体时,in->seek(0)就不起作用了.
chinajiji
2003-06-03
打赏
举报
回复
in->seekg(0);
in->clear();
改成:
in->clear();
in->seekg(0);//seekg()只有当in->false()为false的时候有效
fangrk
2003-06-03
打赏
举报
回复
void myread(ifstream *in)
{
in->seekg(0);
string s;
while(getline(*in,s,'\n'))
{
...
}
in->clear();
}
hhmmdd
2003-06-03
打赏
举报
回复
就是文本文件,第一轮从头读到尾都很正常,然后用
in->seekg(0);
in->clear();
把文件指针定位到开始再getline, getline返回false
atma
2003-06-03
打赏
举报
回复
不太清楚你的问题。帮你up一下吧。
PS: 你打开文件的时候,有没有注意要指定文件模式,比如ios::binary ?
ifstream
多次读取文件
一个朋友向我请教一个程序,相关代码如下: string s; vector vs;
ifstream
inFile("F://MyReceiveFiles//FillCompo_KP.mod", ios::in); while (
getline
(inFile, s)) vs.pus
重复赋值stringstream类变量和
getline
(cin,s)循环使用
清空stringstream类变量值,方法: str.clear(); str.str("");//两句都要写 一个循环的小例子,两者结合起来: ...
getline
(cin, strr); while (strr != "exit") { str.s...
MFC使用
ifstream
读取txt文件时选择读取一行
MFC使用
ifstream
读取txt文件时选择读取一行
ifstream
用法
>>只能读取输入数值,不能读取输入字符或者字符串。
getline
的参数只能是char*,不能是string。...sscanf在vs2017
中
需要用sscanf_s代替。格式字符串类型说明:https://en.cppreference.com/w/cpp/io/c/fs...
c++
中
使用
ifstream
对文件按照行间隔或者符号间隔来读取
2、使用
ifstream
的
getline
读取行 下面的这段代码,直接使用了前面已经打开了的readIn对象,所以,我们直接使用了位置游标回零的函数seekg,要注意的是前面的clear函数,它清理掉了上一次操作的游标记录,如果不使用...
工具平台和程序库
24,854
社区成员
27,343
社区内容
发帖
与我相关
我的任务
工具平台和程序库
C/C++ 工具平台和程序库
复制链接
扫一扫
分享
社区描述
C/C++ 工具平台和程序库
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章