亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我需要手動關閉ifstream嗎?

我需要手動關閉ifstream嗎?

慕哥9229398 2019-10-08 10:18:58
close()使用時需要手動打電話std::ifstream嗎?例如,在代碼中:std::string readContentsOfFile(std::string fileName) {  std::ifstream file(fileName.c_str());  if (file.good()) {      std::stringstream buffer;      buffer << file.rdbuf();      file.close();      return buffer.str();  }  throw std::runtime_exception("file not found");}我需要file.close()手動打電話嗎?不應該ifstream使用RAII關閉文件嗎?
查看完整描述

4 回答

?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

沒有


這就是RAII的目的,讓析構函數完成其工作。手動關閉它沒有什么害處,但這不是C ++方式,而是使用類在C中進行編程。


如果要在函數結束之前關閉文件,則可以始終使用嵌套作用域。


在標準(27.8.1.5類模板basic_ifstream)中,ifstream將使用basic_filebuf擁有實際文件句柄的成員來實現。它作為成員保存,以便當ifstream對象銷毀時,它還會在上調用銷毀器basic_filebuf。根據標準(27.8.1.2),該析構函數將關閉文件:


virtual ?basic_filebuf();


效果:銷毀class對象basic_filebuf<charT,traits>。來電close()。


查看完整回答
反對 回復 2019-10-08
?
繁星點點滴滴

TA貢獻1803條經驗 獲得超3個贊

您需要關閉文件嗎?

沒有


您應該關閉文件嗎?

要看。


您是否擔心文件無法正確關閉時可能發生的錯誤情況?請記住,setstate(failbit)如果失敗,則關閉呼叫。析構函數會調用close()自動為您因為RAII但不會離開你作為測試對象已不存在失敗位的方法。


查看完整回答
反對 回復 2019-10-08
?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

您可以允許析構函數完成其工作。但是,就像任何RAII對象一樣,有時手動調用close可能會有所作為。例如:


#include <fstream>


using std::ofstream;


int main() {

  ofstream ofs("hello.txt");

  ofs << "Hello world\n";

  return 0;

}

寫入文件內容。但:


#include <stdlib.h>


#include <fstream>


using std::ofstream;


int main() {

  ofstream ofs("hello.txt");

  ofs << "Hello world\n";

  exit(0);

}

沒有。在極少數情況下,進程突然退出。崩潰過程可能會執行類似的操作。


查看完整回答
反對 回復 2019-10-08
?
www說

TA貢獻1775條經驗 獲得超8個贊

不,這是由ifstream析構函數自動完成的。您應該手動調用它的唯一原因是因為fstream實例的作用域很大,例如,如果它是壽命很長的類實例的成員變量。


查看完整回答
反對 回復 2019-10-08
  • 4 回答
  • 0 關注
  • 3414 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號