ifstream f;f.open("d:\\3.txt");cout<<f.rdbuf();cout<<f.tellg()<<endl;f.close();f.clear();f.open("d:\\4.txt");string s;f>>s;cout<<s<<endl;if(f)cout<<"ok";elsecout<<"no";cout<<f.rdbuf();这段程序,在3.txt和4.txt中已经有内容.但是现在运行结果是输出3.txt的内容 和成功将4.txt的内容赋值给s,并把s输出,然后if判断中输出ok,但是最后一句将4.txt的内容输出是没有执行(没有输出)。为什么?想知道clear()的用法,这里如果我把clear()语句注释掉,运行结果一样.但是c++ primer上说的是如果要重用流对象,必须记得关闭(close)和清除(clear).那注释掉clerar()不是应该会运行错误吗?求解释?
3 回答
小怪兽爱吃肉
TA贡献1852条经验 获得超1个赞
恕我不能回答第一个问题,因为我从来没见过把rdbuf()的返回值打印的写法。c++primer是很多年前看的了,如果我没记错的话,书里面也没有把rdbuf()的返回值直接打印的例子吧(如果我记错了,请指出)
事实上,在我的机器上,最后一句可以打印出4.txt余下的内容。这个事实也间接回答了你第二个问题。是否需要clear()操作才能重用流对象取决于可能很多因素,所以有些机器上你不需要clear,有些机器上你必须clear否则会报错。
c++ primer的意思是,如果你想写出优秀的代码,可复用的代码,那么你必须写clear,否则你不知道在谁的机器上这代码可能不能运行。
你可以把你的4.txt的内容贴出来,看看在我机器上运行结果如何
精慕HU
TA贡献1845条经验 获得超8个赞
有些C++实现要求在程序末尾使用f.clear(),有些则不要求,这取决于将文件与ifstream对象关联起来时,是否重置流状态,使用f.clear()是无害的
添加回答
举报
0/150
提交
取消