Re: [問題] ofstream 開啟失敗

看板C_and_CPP作者 (卡卡獸)時間9年前 (2014/12/21 13:31), 9年前編輯推噓7(7027)
留言34則, 12人參與, 最新討論串2/2 (看更多)
※ 引述《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 清掉 , 使該物件可重覆使用 } -- 「自從我學了 C# , 人都變聰明 , 考試都考一百分」 「自從我學了 VB , 皮膚都變好 , 人也變漂亮了 」 「自從我學了 Java , 明顯變壯 , 個子也變高了 」 「自從我學了 C++ , 內分泌失調 , 頭都禿了... 」 < Kuso 星爺語錄 > -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.177.74.8 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1419139902.A.ACA.html ※ 編輯: EdisonX (180.177.74.8), 12/21/2014 13:33:51

12/21 14:44, , 1F
學完C++再學C#,JAVA真的會寫到高潮
12/21 14:44, 1F

12/21 14:46, , 2F
那 Python 怎麼辦?
12/21 14:46, 2F

12/21 14:47, , 3F
檔案第一次開失敗 那你有開第二次嗎?
12/21 14:47, 3F

12/21 14:49, , 4F
謝謝edisonx大!
12/21 14:49, 4F

12/21 14:52, , 5F
不過其實我覺得每個iteration直接重新建一個local的ofstream
12/21 14:52, 5F

12/21 14:53, , 6F
就好 不用自己去close()和clear()
12/21 14:53, 6F

12/21 15:24, , 7F
不贊同樓上,有開就要關
12/21 15:24, 7F

12/21 15:29, , 8F
local ofstream生命周期結束就會自動關呀
12/21 15:29, 8F

12/21 15:30, , 9F
我比較傾向local ofstream的寫法
12/21 15:30, 9F

12/21 16:19, , 10F
推 PkmX。不用 RAII 幹嘛寫 C++,有 class 的 C 也
12/21 16:19, 10F

12/21 16:19, , 11F
不是這樣寫
12/21 16:19, 11F

12/21 16:24, , 12F
我都開新的 block 避免忘記寫 .close(),建構時就開
12/21 16:24, 12F

12/21 16:24, , 13F
檔也不需要 .open()。你要有個 name 給 block 後的
12/21 16:24, 13F

12/21 16:24, , 14F
區段用就 smart pointer
12/21 16:24, 14F

12/21 20:19, , 15F
Local+1 但還是會寫close
12/21 20:19, 15F

12/21 21:50, , 16F
蠻多例子是用 local 開,在 dtor 時自動做,這點無誤.
12/21 21:50, 16F

12/21 21:51, , 17F
唯我只是覺得原 po 遇到的可能是我所敘述的問題.
12/21 21:51, 17F

12/21 22:31, , 18F
所以一開始就在loop內開一個新的根本就不會有這問題不是= =
12/21 22:31, 18F

12/21 22:43, , 19F
@PkmX , 是的。
12/21 22:43, 19F

12/22 10:10, , 20F
從OO的觀點來看,ofstream物件在這邊代表每次迭代時
12/22 10:10, 20F

12/22 10:10, , 21F
各自的寫檔操作,比起本來只有一個物件,創 local ob
12/22 10:10, 21F

12/22 10:10, , 22F
j 更能反映問題;不然以跑迴圈前就創的那個物件來說
12/22 10:10, 22F

12/22 10:10, , 23F
,它的存在在問題裡是未定義的,這就是為什麼有的人
12/22 10:10, 23F

12/22 10:10, , 24F
寫碼不註解就很難理解的原因
12/22 10:10, 24F

12/24 03:57, , 25F
想問一下,每次都要重新創出 object 不會效率低落嗎?
12/24 03:57, 25F

12/24 05:52, , 26F
"效率相對較低" 不代表 "效率低落"
12/24 05:52, 26F

12/24 05:53, , 27F
寫程是本來就是在"好讀、好維護"和"消耗硬體資源"之間
12/24 05:53, 27F

12/24 05:53, , 28F
作取捨
12/24 05:53, 28F

12/24 05:54, , 29F
付出一點點的資源換來好讀、好維護的程式碼是沒問題的
12/24 05:54, 29F

12/24 05:55, , 30F
不然就乾脆完全不要用virtual function啦 :/
12/24 05:55, 30F

12/24 13:00, , 31F
絕大部分狀況下人的時間比電腦的時間貴很多
12/24 13:00, 31F

12/24 14:17, , 32F
嗯... 是這樣沒錯
12/24 14:17, 32F

12/24 17:25, , 33F
不是寫嵌入 不是寫critical section 不是寫超大資料流
12/24 17:25, 33F

12/24 17:25, , 34F
就不要自作聰明過早最佳化,這其實很危險
12/24 17:25, 34F
文章代碼(AID): #1Kbbi-hA (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Kbbi-hA (C_and_CPP)