关于文件读写的问题 代码很短

operatingtuzi 2009-02-15 11:04:28
想输出文件的内容,有两段代码,看起来好像一样,但是运行结果不同,请高人解释一下
一正常输出 二不正常

代码一:

ifstream &openfile(ifstream & ifs,const string & str)
{
ifs.close();
ifs.clear();
ifs.open(str.c_str());
return ifs;
}

int _tmain(int argc, _TCHAR* argv[])
{
ifstream ifs;
string str,str1;
cin>>str;

while(openfile(ifs,str)>>str1,!openfile(ifs,str).eof()) //注意此处
cout<<str1;

ifs.close();
}


代码二:

ifstream &openfile(ifstream & ifs,const string & str)
{
ifs.close();
ifs.clear();
ifs.open(str.c_str());
return ifs;
}

int _tmain(int argc, _TCHAR* argv[])
{
ifstream ifs;
string str,str1;
cin>>str;
ifstream& i=openfile(ifs,str);//(问题1)这里如果i不是引用会出错 为什么呢
while(i>>str1,!i.eof()) //(问题2)为什么改成这样 输出就会无限循环了呢
cout<<str1;

ifs.close();
}

问题三 文件流使用完毕都要clear吗
应该先clear还是先close?
...全文
209 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
operatingtuzi 2009-03-11
  • 打赏
  • 举报
回复
到底是先关后请还是先清后关呢。。
operatingtuzi 2009-03-11
  • 打赏
  • 举报
回复
到底是先关后请还是先清后关呢。。
operatingtuzi 2009-03-05
  • 打赏
  • 举报
回复
到底是先关后请还是先清后关呢。。

chenfeng4321 2009-02-17
  • 打赏
  • 举报
回复
primer上是先关后清
nullah 2009-02-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 taodm 的回复:]
1 stream族都没有拷贝构造函数
2 用while(i >> str1)这样的代码。
[/Quote]
up~~
流对象怎么能直接赋值呢
feng4206yu 2009-02-16
  • 打赏
  • 举报
回复

ifstream &openfile(ifstream & ifs,const string & str)
{
ifs.close();
ifs.clear();
ifs.open(str.c_str());
return ifs;
}

int _tmain(int argc, _TCHAR* argv[])
{
ifstream ifs;
string str,str1;
cin>>str;
ifstream& i=openfile(ifs,str);//(问题1)这里如果i不是引用会出错 为什么呢
while(i>>str1,!i.eof()) //(问题2)为什么改成这样 输出就会无限循环了呢
cout<<str1;

ifs.close();
}


问题1.2楼的说法是错误的,但是关于你的问题我也回答不上来,我不用引用可以出来结果但是最后会程序错误。
问题2.关键点在这里:(i>>str1,!i.eof())由于i>>str1之后流i所表示文件指针的位置已经变动了,这时候!i.eof()判断的已经不是原来的位置了,所以如果文件中最后一个string是永远读不出来的,解决办法(!i.eof(),i>>str1)..
问题3.第一个程序才是个无限循环,openfile(ifs,str)得到的永远是一个指向文件初始位置的流...无限输出第一个string..
blueness21 2009-02-16
  • 打赏
  • 举报
回复
这个貌似是C++ Primer4th上面就是这么写的。。。。
tangshuiling 2009-02-16
  • 打赏
  • 举报
回复

一句代码就可以搞定的,何须如此麻烦:
ifstream infile("FILE");
string str((istream_iterator<char>(infile)),istream_iterator<char>());
cout<<str;
waizqfor 2009-02-16
  • 打赏
  • 举报
回复

while(i>>str1,!i.eof()) //(问题2)为什么改成这样 输出就会无限循环了呢

循环判断的时候 不要怎么写 LZ看的书估计不怎么好
直接
while(i>>str1)这样就可以了
operatingtuzi 2009-02-16
  • 打赏
  • 举报
回复
先clear后close吗
那这个程序是不是应该把前面的顺序改一下?
我看到primer上面好几个例子都是先close在clear。。。
taodm 2009-02-16
  • 打赏
  • 举报
回复
1 stream族都没有拷贝构造函数
2 用while(i >> str1)这样的代码。
sunnywyg 2009-02-15
  • 打赏
  • 举报
回复
先clear再close

//(问题1)这里如果i不是引用会出错 为什么呢 ----------函数返回类型是引用

//(问题2)为什么改成这样 输出就会无限循环了呢 ----------对不起,使用你的代码我正常运行了...
waizqfor 2009-02-15
  • 打赏
  • 举报
回复
先清除缓冲区 再关闭吧 养成好习惯!~

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧