[問題] 砍檔頭的方式

看板C_and_CPP作者 (宮城法碼)時間13年前 (2011/06/30 16:30), 編輯推噓7(7023)
留言30則, 7人參與, 最新討論串1/1
請問各位板友: 假設我有一個檔案,想要把檔頭 n 個 bytes 刪除, 剩下的內容存成另一個檔,原始檔案不用保留, 那我除了 fopen -> 讀進 buffer -> 位移後fwrite到另一個檔案 還有沒有什麼API或是其他簡潔的方式可以達到一樣的效果? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.164.67

06/30 16:59, , 1F
先 truncate 再 rename ?
06/30 16:59, 1F

06/30 17:01, , 2F
在 linux 下可以用cmd: tail -c +6 oldfile > newfile 解決
06/30 17:01, 2F

06/30 17:11, , 3F
啊 我看成是保留前 n 個 bytes ... 當我沒講 orz
06/30 17:11, 3F

06/30 17:24, , 4F
簡潔與速度不可兼得,慎思。
06/30 17:24, 4F

06/30 17:35, , 5F
自己寫一個函數出來,以後重複用就簡潔了
06/30 17:35, 5F

06/30 17:38, , 6F
如果你想說改個小地方,新檔案的起始處,就能從原檔案的某
06/30 17:38, 6F

06/30 17:39, , 7F
位置變出來,都不用作資料複製的動作,現在的檔案系統應該
06/30 17:39, 7F

06/30 17:39, , 8F
不能這樣做才對....
06/30 17:39, 8F

06/30 17:48, , 9F
大概瞭解了,我本來想說有類似可以更改檔案起頭位址的API
06/30 17:48, 9F

06/30 17:52, , 10F
然後直接把它往後移就好...XDDDDDDD
06/30 17:52, 10F

06/30 18:40, , 11F
阿不就fseek從開頭往前n bytes 就好了嗎?
06/30 18:40, 11F

06/30 18:49, , 12F
這樣用其他軟體開啟這個檔,檔頭就會是你移動過的位址嗎?
06/30 18:49, 12F

06/30 18:49, , 13F
例如用 UEdit 之類的開起來看
06/30 18:49, 13F

06/30 18:54, , 14F
用fseek移還是得把資料讀進buffer再另存新檔...
06/30 18:54, 14F

06/30 18:54, , 15F
讀取部份可以用fseek改良
06/30 18:54, 15F

06/30 18:55, , 16F
喔喔,你是說跳過不要的部份才開始讀嗎?
06/30 18:55, 16F

06/30 18:55, , 17F
這個動作OK,但是其實想要的是連讀都不用讀的方法.. :p
06/30 18:55, 17F

06/30 18:56, , 18F
恩恩 這可省下要讀前面多花費的動作
06/30 18:56, 18F

06/30 18:57, , 19F
時間倒還好,其實只有 44 bytes.... = ="
06/30 18:57, 19F

06/30 18:59, , 20F
想說就為了這44bytes,要fopen, 要fseek,ftell取得檔案大小
06/30 18:59, 20F

06/30 19:00, , 21F
要assign buffer,要fseek回起頭44bytes的地方再fread
06/30 19:00, 21F

06/30 19:00, , 22F
然後又要fopen新檔,再fwrite buffer裡的資料....orz...
06/30 19:00, 22F

06/30 19:16, , 23F
有要那麼麻煩嗎....
06/30 19:16, 23F

06/30 19:50, , 24F
你就用ab+開檔阿...
06/30 19:50, 24F

06/30 19:53, , 25F
這樣應該可以直接用ftell取得檔案大小了吧...
06/30 19:53, 25F

06/30 20:02, , 26F
聽起來架構怪怪的..全都塞到memory再一次寫入不行嗎?
06/30 20:02, 26F

06/30 20:12, , 27F
應該是考慮到大檔吧 例如檔案大小如果有8G的話...
06/30 20:12, 27F

06/30 20:18, , 28F
@stimim: linux下可以用 dd if=old of=new skip=44c
06/30 20:18, 28F

06/30 22:39, , 29F
@zetab:>2G就不能用ftell/filelength,<=2G可以全塞mem.
06/30 22:39, 29F

06/30 23:24, , 30F
那就用stat吧...
06/30 23:24, 30F
文章代碼(AID): #1E33GAlJ (C_and_CPP)