看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VS2010 問題(Question): 想請問各位一個新手問題 如果我有一份txt檔案內容為 111 我想把它更改成 222(長度不變) 除了先把它讀出來到memory中修改完再寫回去之外 有辦法在讀取的當下就直接做字元判斷更改嗎? p = fopen("tmp.txt","r+"); while((c=fgetc(p))!=EOF) { if(c == '1') { fputc('2', p); } } fclose(p); 這樣的code並無法使用 請問問題出在哪裡? 謝謝大家指教. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.194.220.143 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1429444081.A.C13.html
TobyH4cker: r+ ... 04/19 19:57
TobyH4cker: 沒事 04/19 19:57
TobyH4cker: 檔案串流是這樣,你讀取到哪裡,指標就指到哪裡 04/19 19:58
TobyH4cker: 所以如果要直接對串流做修改,要再修改指標位址 04/19 20:00
TobyH4cker: fseek 04/19 20:00
EdisonX: char ch; 04/19 20:12
EdisonX: FILE * fp = fopen("C:\\s.txt", "r+"); 04/19 20:13
EdisonX: @@ 手機掛了,請無視上面兩行 Orz 04/19 20:13
EdisonX: http://pastie.org/10101324 大概像這樣吧.. 04/19 20:15
zoooooa: 謝謝樓上兩位解答 感恩~ 04/19 20:19
EdisonX: 抱歉我只是雞婆想問... 這種直接對檔案做修改處理的 , 04/19 20:43
EdisonX: 真的會比全都 dump 到記憶體改完,再一次寫回去快嗎 ??? 04/19 20:44
EdisonX: 我的記憶還停留在對檔案處理的函式用得愈少愈好,拉到mem 04/19 20:44
EdisonX: 裡做完再一次處理速度比較快... 04/19 20:45
MOONRAKER: fputc()是buffered output,你需要用fread()/fwrite() 04/19 20:46
MOONRAKER: 達成直接讀寫。 04/19 20:46
MOONRAKER: 至於快或慢,當檔案比可用記憶體大很多、或者很久很久 04/19 20:47
MOONRAKER: 才要更改檔案內一些小地方時,buffered read是否還一樣 04/19 20:49
MOONRAKER: 好呢? 04/19 20:49
EdisonX: 原來如此.. 那應是我讀寫的算小檔而已 (數MB), 感謝 M 大 04/19 20:52
MOONRAKER: 也只是理論而已 畢竟現在這種記憶體很少又沒有VM的狀況 04/19 20:56
MOONRAKER: 不多 但是像單晶片上可能就有差了 04/19 20:57