Re: [問題] 關於讀檔和寫檔

看板C_and_CPP作者 (單身公害)時間14年前 (2009/12/21 22:11), 編輯推噓1(103)
留言4則, 2人參與, 最新討論串5/5 (看更多)
※ 引述《ledia (下班後才下棋)》之銘言: : ※ 引述《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 我也想請問一下 最近在wince6.0的系統中跑一支程式也是會不斷的寫入檔案 是用writefile來寫的,每秒會寫入一次 可是目前遇到一個問題,系統上的開機檔是放在SD卡中 經過不斷的重開機後有時候會造成SD卡的資料都消失 沒有固定的規則可循 然後下一次開機因為開機檔沒了所以開機失敗 是我寫檔的方式有問題嗎 我在thread裡面是不斷的createfile跟writefile然後再close掉 為什麼會出現這個現象搞不太懂@@ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.70.125.159

12/21 22:52, , 1F
你用的不是 CRT, 是 win32 的 API, manual 上有一些參數
12/21 22:52, 1F

12/21 22:52, , 2F
像是 FILE_FLAG_WRITE_THROUGH <-- 你要不要試試 ?
12/21 22:52, 2F

12/21 22:53, , 3F
12/21 22:53, 3F

12/21 22:58, , 4F
感謝,我會仔細看看
12/21 22:58, 4F
文章代碼(AID): #1BBu8ijM (C_and_CPP)
文章代碼(AID): #1BBu8ijM (C_and_CPP)