2013-01-16 38 views
1

假設我有一個二進制文件和所有記錄工作人員的文本文件。 默認總月份時間都設置爲0. 如何實際訪問二進制文件中的特定月份並將其更改爲所需值?將特定記錄添加到二進制文件C++

這是文本文件格式

 
ID Name J F M 
1 Jane 0 0 0 
2 Mark 0 0 0 
3 Kelvin 0 0 0 

 
ID Name J F M 
1 Jane 0 0 25 
2 Mark 0 0 30 
3 Kelvin 0 0 40 

25實際上是在三月份的工作小時數。

+0

這樣做與原始二進制輸入/輸出是一個真正的痛苦。記錄是否已經存在,或者您是否要創建它們? – JesseTG

回答

1

文件是一個字節流。您可以通過使用c系列函數fopen fread fwrite來訪問文件。或者通過C++ iostream操作。在每種情況下,您都需要通過知道其位置然後閱讀和寫入該記錄來查找記錄。如果記錄的大小不是固定的,則必須處理移動所有後續記錄。

3

我認爲這裏第一個問題就是你所說的「二元」。你是從字面上顯示文件的格式嗎?換句話說,在輸入時,字符是'0'還是'\ 0'?完成後,是否要讓文件包含兩個數字'3'和'0'或單個字符'\ 25','\ 30'或'\ 40'?

如果你正在處理每個輸入記錄中已知偏移量的單個字符,並且希望用結果中的單個字符替換它,事情就變得非常簡單:尋找文件中的右側偏移量,寫一個字節,尋找下一個偏移量,並繼續'直到你更新了所有的記錄。

如果輸入文件包含字符串,那麼當您更新該值時,它的長度將會(可能)發生變化,那麼您幾乎無法讀取數據,修改內存並將新數據寫回(通常是新文件)。這也很容易,但如果文件很大,速度可能會變慢。

如果你是在一個真正的程序中這樣做,我會考慮三次就自己做。我會考慮使用類似SQLite的東西來處理數據。這不僅可以讓你簡化你的代碼,而且使你的客戶的生活更加美好。它使用known/documented file format,所以其他工具可以處理數據,備份等。它支持事務,日誌記錄,回滾等。簡而言之,他們得到一個強大的解決方案,而不是另一個脆弱的問題。