精華區beta C_and_CPP 關於我們 聯絡資訊
順便藉這個機會寫一下簡易版 fopen mode string 的分別法: "r" 從頭開始讀、不洗掉內容 "w" 從頭開始寫入、洗掉內容 "a" 從尾巴開始寫入、不洗掉內容 附上一個 "+" 就是都改成讀寫 不過一般如果真要用同時讀寫來 update 的話 通常是開成 "r+" 因為 "a+" 在檔案的內部指標不在最後面時寫入似乎會發生奇怪的現象 然後是 "t" 開成文字模式 "b" 開成二進位模式 在 Windows 下這個選項影響換行字元的讀寫及檔案結束的判定 沒寫的話是 "t" 除非你設定 _fmode = _O_BINARY; 開成 "t" 時 \n 寫進檔案會變成 \r \n 兩個 byte 讀進來碰到連續的 \r \n 會當成只有一個 \n 當讀到 \x1a (\032, ASCII 26) 時會當做檔案結束 開成 "b" 時就是直接照搬 在 Unix/Linux 下面 (正確的說是 POSIX 相容平台) 則沒有這個選項 一切都是直接照搬 雖然為了符合 C90 的標準可以放個 b 進去 不過會忽略掉它 (但是不能放 t 那是 Windows (或說 MSVCRT) 專有的選項) -- 有人喜歡邊玩遊戲上逼; 也有人喜歡邊聽歌打字。 但是,我有個請求, 選字的時候請專心好嗎? -- 改編自「古 火田 任三郎」之開場白 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.28.92
VictorTom:L大文章都回成這樣了, 啊小弟我除了推還能幹麻....XD 12/19 00:44
elfkiller:喔喔 實用推 12/19 00:58
> -------------------------------------------------------------------------- < 作者: 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