2011-09-04 120 views
6

我在覆蓋C++文件中的某些數據時遇到問題。單讀音使用的代碼是C++覆蓋特定位置的文件中的數據

int main(){ 
    fstream fout; 
    fout.open("hello.txt",fstream::binary | fstream::out | fstream::app); 
    pos=fout.tellp(); 
    fout.seekp(pos+5); 
    fout.write("####",4); 
    fout.close(); 
    return 0; 

}

問題即使使用seekp之後,數據總是寫入在end.I希望將其在特定位置寫。 如果我不添加fstream ::應用程序,該文件的內容被刪除。 謝謝。

+0

你想覆蓋的數據的確切位置是什麼? – Flinsch

回答

8

問題出在fstream::app - 它打開要附加的文件,意味着所有寫入文件的末尾。爲避免刪除內容,請嘗試以fstream::in打開,也就是說用fstream::binary | fstream::out | fstream::in打開。

+0

但不是fstream :: in從流中讀取,我將如何能夠使用它寫入流? – karyboy

+2

如果您同時使用'fstream :: in'和'fsteam :: out',您將打開文件進行讀取和寫入 - 意味着它將在不刪除以前的內容的情況下打開進行寫入。 –

+0

Thanx mate,你是一個救世主..... – karyboy

2

你想要的東西,像

fstream fout("hello.txt", fstream::in | fstream::out | fstream::binary); 
fout.seek(offset); 
fout.write("####", 4); 

fstream::app告訴它移動到每個輸出操作前的文件的末尾,所以即使你明確地尋找到一個位置,寫入位置被強制結束時,你做write()(即seekp(0, ios_base::end);)。

cf. http://www.cplusplus.com/reference/iostream/fstream/open/

還有一點需要注意的是,由於您打開文件fstream::app,tellp()應該返回文件的結尾。所以seekp(pos + 5)應該試圖超越文件位置的當前結束。

+0

你也可以指出這一點....現在一切按預期工作.. – karyboy