簡體   English   中英

fstream替換文件的一部分

[英]fstream replace portion of a file

當我做

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個字節,而其余部分不受影響。

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

ATM我無法檢查我的引用,因此請務必仔細檢查,但我認為這是准確的。

如果要在文件末尾編寫,則需要附加標志ios :: app。

要在文件中間任意位置執行此操作,您需要尋找正確的位置。 您可以通過打開和關閉文件來執行此操作,但是如果您是我,那么我將創建一個臨時文件,將輸入向上復制以進行標記,寫入新數據,將其余內容復制到EOF,關閉文件並替換之前的文件。臨時文件的版本。 這稱為“主文件更新”。

由於文件已經存在,請以“讀+寫”模式打開它,然后執行seekp。 我認為它將起作用。

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

ios:in掩碼告訴文件指針在文件開頭的位置,以便它可以從頭開始讀取。 但是,您可能要使用fseek在文件的開頭設置文件指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM