作者:
EdisonX (卡卡獸)
2014-12-21 13:31:37※ 引述《xshane831 (Shane)》之銘言:
推文麻煩
: char filename[]="Result.txt";
: ofstream fp;
下面三行我覺得沒太必要,
: fp.open(filename, ios::out);
: if(!fp)
: fp.open(filename, ios::out);
假設第一次的 fp.open 是失敗的話
我不確定再做一次 fp.open 有什麼意義
若真要這麼做,在第二次 open 之前再把所有 flag 清掉
後面兩行變成
if(!fp) {
fp.clear() ;
fp.open(filename, ios::out);
}
但真覺得沒太大必要
: if(fp)
: {
: fp << xxxxxx;
: fp << endl;
: }
: fp.close();
下面 sample 大概是你要的
for( i = 0 ; i < ntimes ; ++i)
{
fp.open(filename, ios::out);
if(fp) {
fp << xxxxxx;
fp << endl;
fp.close(); // 開啟成功才有必要 close , 失敗就不用 close
}
fp.clear(); // 把 ostream 所有 flag 清掉 , 使該物件可重覆使用
}
作者:
s25g5d4 (function(){})()
2014-12-21 14:46:00那 Python 怎麼辦?
作者:
PkmX (阿貓)
2014-12-21 14:47:00檔案第一次開失敗 那你有開第二次嗎?
作者:
PkmX (阿貓)
2014-12-21 14:52:00不過其實我覺得每個iteration直接重新建一個local的ofstream就好 不用自己去close()和clear()
作者: Jimmy0301 (Jimmy) 2014-12-21 15:24:00
不贊同樓上,有開就要關
作者:
kwpn (ITSST)
2014-12-21 15:29:00local ofstream生命周期結束就會自動關呀我比較傾向local ofstream的寫法
推 PkmX。不用 RAII 幹嘛寫 C++,有 class 的 C 也不是這樣寫我都開新的 block 避免忘記寫 .close(),建構時就開檔也不需要 .open()。你要有個 name 給 block 後的區段用就 smart pointer
作者:
EdisonX (卡卡獸)
2014-12-21 21:50:00蠻多例子是用 local 開,在 dtor 時自動做,這點無誤.唯我只是覺得原 po 遇到的可能是我所敘述的問題.
作者:
PkmX (阿貓)
2014-12-21 22:31:00所以一開始就在loop內開一個新的根本就不會有這問題不是= =
作者:
EdisonX (卡卡獸)
2014-12-21 22:43:00@PkmX , 是的。
從OO的觀點來看,ofstream物件在這邊代表每次迭代時各自的寫檔操作,比起本來只有一個物件,創 local obj 更能反映問題;不然以跑迴圈前就創的那個物件來說,它的存在在問題裡是未定義的,這就是為什麼有的人寫碼不註解就很難理解的原因
作者:
ACMANIAC (請肥宅救救肥宅)
2014-12-24 03:57:00想問一下,每次都要重新創出 object 不會效率低落嗎?
"效率相對較低" 不代表 "效率低落"寫程是本來就是在"好讀、好維護"和"消耗硬體資源"之間作取捨付出一點點的資源換來好讀、好維護的程式碼是沒問題的不然就乾脆完全不要用virtual function啦 :/
作者:
ACMANIAC (請肥宅救救肥宅)
2014-12-24 14:17:00嗯... 是這樣沒錯
不是寫嵌入 不是寫critical section 不是寫超大資料流就不要自作聰明過早最佳化,這其實很危險