2011年1月4日 星期二

win32 裡的 fopen 還有很多奇奇怪怪的 mode

作者: ledia (下班後才下棋) 看板: C_and_CPP
標題: Re: [問題] 關於讀檔和寫檔
時間: Mon Dec 21 01:18:03 2009

※ 引述《LPH66 ((short)(-15074))》之銘言:
: 順便藉這個機會寫一下簡易版 fopen mode string 的分別法:
: "r" 從頭開始讀、不洗掉內容
: "w" 從頭開始寫入、洗掉內容
: "a" 從尾巴開始寫入、不洗掉內容
: 附上一個 "+" 就是都改成讀寫
: 不過一般如果真要用同時讀寫來 update 的話  通常是開成 "r+"
: 因為 "a+" 在檔案的內部指標不在最後面時寫入似乎會發生奇怪的現象
: 然後是
: "t" 開成文字模式
: "b" 開成二進位模式


  其實 win32 裡的 fopen 還有很多奇奇怪怪的 mode
  像是 c, n, N, S, R, T, D
  可以參考 http://msdn.microsoft.com/en-us/library/yeby3zcb%28VS.80%29.aspx

  分享其中一個例子 c

  之前遇過某一隻程式
  他需要很頻繁的更新同一個檔案
  但是好死不死當無預警的重開機發生了 (比如說停電、被踢到插頭)
  他所更新的檔案有時候就會變成全是 0 的壞檔!

  這是可複製的 bug
  像是 fflush 、寫完馬上 fclose 都用了就是沒有任何幫助

  找了很久發現原來是因為 win32 的 fflush fclose 都不保證寫進 disk (!)
  也許和 OS 在 I/O 的處理上, 使用 disk cache 的機制有關
  總之要確保一定會寫到 disk 裡, 就是要加上 mode c
  比如說 fopen(filename, "wc"); // commit flag
  經實測, 真的再怎麼亂重開機, 原本的問題都不會發生了

  感覺 M$ 在這方面下了不少功夫 (我想主要是為了 I/O 的效率)
  所以為了不要動不動被 side effect 給婊到
  有問題時勤讀 manual 我想是個很重要的習慣... orz

--

  有時候,遺忘,是令人快樂的。什麼時候?當然是有人傷了你的心的時候。
存心傷你的那個人,固然是故意和你過不去,但是被傷了心而耿耿於懷的你
,卻是和自己過不去了。所以,記性不好的人,通常會是比較快樂的人,也
是比較不容易被擊倒的人。

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.49
推 MOONRAKER:贊                                                    12/21 03:00
推 lwecloud:推"動不動被 side effect 給婊到" XD                     12/21 09:19
推 VictorTom:這個也是要大推推, 避免OS cache的機制很重要:)          12/21 10:03
→ VictorTom:              ^^為什麼會多打一個字....Orz             12/21 10:03
推 phterry:推一個,很實用                                           12/21 10:14
推 bill42362:三樓在裝可愛!!!                                       12/21 11:48
推 adks3489:WC  囧                                                 12/21 11:59
推 VictorTom:(抱頭)不~~砂鍋大的誤會啊....Q_Q~                      12/21 12:22
推 YCK:其實,樓上應該想那樣做很久了.                                12/21 12:28
→ YCK:XD                                                          12/21 12:28
推 littleshan:我也要推推 不要噓噓(?)                               12/21 12:29
推 VictorTom:為什麼最近常常推文推出笑(笨)點勒....Q_Q~              12/21 13:59
推 cutecpu:推(Y)                                                   12/21 14:55
推 saxontai:PUSH                                                   12/21 15:31
推 StubbornLin:wc模式 是要上廁所就是了 XD                          12/21 15:53
推 PcGrek:推~受教了                                                12/21 17:08

沒有留言:

張貼留言

您好.本資料庫並非第一手資料.如果你有對文章作者的詢問,意見與需求,請自行找尋文章作者並提供意見,謝謝.