qq_遁去的一_1
2021-10-26 19:19:17
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
提交
取消