2009-04-27 115 views
1

的一部分。當我做fstream的替換文件

fstream someFile("something.dat", ios::binary|ios::out); 
someFile.seekp(someLocation, ios::beg); 
someFile.write(someData, 100); 

看來,以取代與100個字節,而不是僅僅更換相應的100個字節整個文件,就好像我指定的ios :: TRUNC。有沒有可移植的方式來截斷文件?

編輯:添加ios :: in似乎在做伎倆,爲什麼這是必需的,並且是標準行爲?

編輯#2:我不想追加到現有的文件。我需要替換100個字節,而其餘部分不受影響。

回答

2

如果要在文件末尾寫入,您需要附加標誌ios :: app。

要在文件中間任意位置執行任務,您需要尋找正確的位置。你可以通過打開和關閉文件來做到這一點,但如果我是你,我會創建一個臨時文件,將輸入複製到標記,寫入新數據,將其餘部分複製到EOF,關閉文件並替換先前的文件版本與臨時文件。這被稱爲「主文件更新」。

+0

是出入非標準還是隻是建議這種數據安全的替代方法? – Sydius 2009-04-27 04:17:23

2

AFAIR ios :: out只指定文件用於輸出和ios:binary僅指定文件是二進制文件。流的默認行爲是創建一個新文件並覆蓋舊文件。如果您想修改現有文件,則必須使用ios :: app標誌打開文件。

自動櫃員機我不能檢查我的參考,所以一定要仔細檢查,但我felieve,這是準確的。

1

ios:in mask將文件指針指向位於文件開頭的位置,以便它可以從頭開始讀入。但是,您可能想使用fseek將文件指針設置在文件的開頭。

2

由於文件已經存在,所以在'讀取+寫入'模式下打開它,然後執行seekp。我認爲它會起作用。

fstream someFile("something.dat", ios::binary|ios::out|ios::in); 
someFile.seekp(someLocation, ios::beg); 
someFile.write(someData, 100);