2011-10-28 30 views
4

我試圖用C++在文件Write函數不使用seekp值

所以basicly我

ofstream ofs("file.dat", ios::binary | ios::app); 
ofs.seekp(220, ios::beg); 
ofs.write((char *)&i, sizeof(i)); 

但無論我做什麼就寫在一個特定的地方的入口總是寫在文件的末尾。

我想這是關係到iso::app因爲根據文檔

app (append) Set the stream's position indicator to the end of the stream before each output operation 

但是,如果使用或沒有它總是會刪除文件的內容。

任何幫助將是巨大的:)

回答

5

是的,這是造成這種現象的ios::app。將其替換爲ios::in | ios::out

編輯:這不是從你的問題不清楚,但您的意見建議你試圖在文件的中間插入數據,而不是覆蓋文件的一部分。如果確實如此,那麼你幾乎必須爲此使用第二個文件。

+0

ofstream默認是到ios :: out。添加ios :: in會破壞程序。 –

+2

@Paté:嗯,默認是不相關的,因爲你沒有使用它(你正在使用'ios :: binary ...')。另外,當你說「休息」時,究竟以什麼方式? – NPE

+0

你檢查了錯誤標誌(eofbit,failbit,badbit)嗎? –

1

您是否嘗試過使用ios::out而不是ios::app

編輯:

讀取@curiousguy引用它看起來像你需要ios::in | ios::out,而不是僅僅ios::out從截斷保持文檔後。

+0

你想截斷現有的文件? – curiousguy

+0

@curiousguy:不,閱讀完文檔後,我更新了答案。 –

1

文件追加模式

如果操作系統(和網絡文件系統,如適用)支持追加模式,設置追加模式保證寫入時有多個作家文件不會覆蓋現有數據數據。如果沒有追加模式,這是你不能做的事情,因爲不同進程的查找和寫入之間的競爭。這是日誌文件的重要保證。

在附加模式下,您只能按照定義在文件結尾寫入。

的iostream打開模式

根據[ofstream.cons],ofstream (s, mode)呼叫rdbuf()->open(s, mode|ios_base::out)

根據[filebuf中的文件打開模式]表。部件],的filebuf::open行爲中的fopen打開模式術語被定義:

  • out手段 「W」
  • appapp|out意味着 「一個」
  • in|out是指 「R +」
  • in|out|trunc裝置「w +」

根據fopen man,模式的含義是:

  • r +開放閱讀和寫作。
  • w將文件截斷爲零長度或創建用於書寫的文本文件。
  • w +開放閱讀和寫作。如果該文件不存在,則會創建該文件,否則會被截斷。
  • a可供追加(寫在文件末尾)。如果該文件不存在,則會創建該文件。

最後,ate表示fseek(file,0,SEEK_END)

所以,如果你想打開任意位置寫入,而不破壞現有的數據,你需要fopen(s,"r+")ofstream (s, ios::in|ios::out)

IOW,在C/C++中,您還需要讀取文件才能打開文件,而不會覆蓋文件!

POSIX世界

您可能需要使用POSIX open函數來代替,以便直接訪問POSIX打開標誌:O_READO_WRITEO_CREATO_EXCLO_TRUNC ...他們是不是更強大,但也獨立和乖,不像filebuf::open標誌。

當然,這個函數不是標準C++的一部分。相信所有相關係統支持open

相關問題