比如txt內容如下,有三行(非二進制檔案)
test1##100
test2##100
test3##100
我要對第一行重寫為test1##99.5,并保持原來三行的格式
把讀寫指標定位到檔案開頭后,用fstream與<<寫入后發現檔案變成如下:
test1##99.5
est2##100
test3##100
還是三行,但test2第一個字符被吃掉了......,對此有幾個問題想請教
Q1:能否把原檔案內容看作"test1##100\ntest2##100\ntest3##100"這樣一個字串存盤的?(感覺這樣就能理解為何出現上面的bug了)
Q2:解決思路1:重寫test1這行之前,把test2到檔案結尾所有內容存入臨時檔案并洗掉,重寫test1之后再復制回來
(若檔案行數非常多,又要重寫的是開頭第1、2行,效率很低) 這個思路可行嘛?
Q3:解決思路2:對test1這行分配新的存盤長度為待重新寫入的字串長度,確保不影響之后的內容
(不會操作,C++有沒有這樣的函式?) 這個思路可行嗎?
麻煩高手幫我答疑解惑,教教我哈
uj5u.com熱心網友回復:
A1:如果不改變第一行的字符數量,直接修改就好,如果改動長度。整個檔案讀入記憶體,改動后重寫回去。所以資料庫先要定好欄位大小,然后才寫記錄。備注型的資料呢?建立索引,改動后如果長度不變寫回,如果長度有變,原來的位置作廢重新寫一塊,但這樣就會有碎片。就像磁盤碎片一樣。如何高效的處理這類問題是資料庫的核心作業之一。
A2:存入記憶體,再寫回去比復制檔案快一些,檔案大可以映射,也可以扇區簇的剩余空間優化,這就比較高級了,很少有應用軟這么做,你可以感受一下office軟體,你改一個大檔案,然后保存,即使改動一個字符也是要保存很久的。
A3:沒有這樣的函式你需要自己寫,比如壓縮后寫回等方法。
uj5u.com熱心網友回復:
A1:磁盤存盤,你的思路沒問題
A2:可以用,效率不是很高
A3:感覺就是問題2里面,臨時檔案換成記憶體的感覺
uj5u.com熱心網友回復:
把整個檔案重新寫一遍即可。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/80172.html
標籤:C++ 語言
