2012-11-14 186 views
0

我在寫一個簡單的日曆應用程序,它將數據保存在文本文件中。我使用iCalendar格式,所以我的文本文件結束「END:VCALENDAR」。C++寫入文本文件的特定部分而不覆蓋

當用戶添加一個新事件時,應用程序應該在文本文件末尾寫入關聯數據而不覆蓋「END:VCALENDAR」,我該怎麼做?如何刪除保存在文本文件中間的事件?是否需要使用更新的數據再次寫入整個文件?非常感謝。

回答

2

您不能通過在文件中間寫入來動態「擴展」該文件。 你需要,可以:

  1. 反序列化整個歷到內存中,然後將它寫回(最好的選擇)
  2. 讀入它位於過去,你要插入的數據點存儲器的一切,寫您的數據,然後寫入存儲的文件「尾部」
1

C++庫不支持任何方法,與append不同,它提供了一個選項,用於在任何特定位置插入文件;無論是文本還是二進制文件。

你有兩種選擇: 首先是你假設的一個,即讀取整個文件,更新數據並重新寫回。 其次是在文件中尋找最後一行的第一個字符E和END:VCALENDAR一樣,寫下你的事件,然後在其中附加「END:VCALENDAR」。

是的,您可以通過編程的方式找到最後一行的第一個字符,E緊接着最後一個換行符。 對不起,就我所知,沒有其他方法。

2

沒有任何方法插入文件的中間;底層操作系統不支持它。通常的技術是將文件複製到一個臨時文件中,然後(如果在複製—的輸出上沒有錯誤,則只需)做出所需的任何修改,確認輸出流沒有失敗關閉後)刪除輸入文件並將臨時文件重命名/移動到原始名稱。

+0

如何檢查輸出流在關閉後是否失敗?通過逐字節地查看文件,或者使用一些C++函數? – rize

+0

僅僅通過測試它,就像你通常會這樣:'if(output)/ * OK */else/* failed * /',或者if(!output)// failed'。 –

相關問題