Re: [問題] 關於讀檔和寫檔
※ 引述《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
推
12/21 03:00, , 1F
12/21 03:00, 1F
推
12/21 09:19, , 2F
12/21 09:19, 2F
推
12/21 10:03, , 3F
12/21 10:03, 3F
→
12/21 10:03, , 4F
12/21 10:03, 4F
推
12/21 10:14, , 5F
12/21 10:14, 5F
推
12/21 11:48, , 6F
12/21 11:48, 6F
推
12/21 11:59, , 7F
12/21 11:59, 7F
推
12/21 12:22, , 8F
12/21 12:22, 8F
推
12/21 12:28, , 9F
12/21 12:28, 9F
→
12/21 12:28, , 10F
12/21 12:28, 10F
推
12/21 12:29, , 11F
12/21 12:29, 11F
推
12/21 13:59, , 12F
12/21 13:59, 12F
推
12/21 14:55, , 13F
12/21 14:55, 13F
推
12/21 15:31, , 14F
12/21 15:31, 14F
推
12/21 15:53, , 15F
12/21 15:53, 15F
推
12/21 17:08, , 16F
12/21 17:08, 16F
推
12/21 20:13, , 17F
12/21 20:13, 17F
推
12/21 23:15, , 18F
12/21 23:15, 18F
→
12/21 23:16, , 19F
12/21 23:16, 19F
→
12/21 23:17, , 20F
12/21 23:17, 20F
推
12/22 05:10, , 21F
12/22 05:10, 21F
→
12/22 05:10, , 22F
12/22 05:10, 22F
討論串 (同標題文章)