假設我有一個二進制文件和所有記錄工作人員的文本文件。 默認總月份時間都設置爲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. 如何實際訪問二進制文件中的特定月份並將其更改爲所需值?將特定記錄添加到二進制文件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實際上是在三月份的工作小時數。
文件是一個字節流。您可以通過使用c系列函數fopen fread fwrite來訪問文件。或者通過C++ iostream操作。在每種情況下,您都需要通過知道其位置然後閱讀和寫入該記錄來查找記錄。如果記錄的大小不是固定的,則必須處理移動所有後續記錄。
我認爲這裏第一個問題就是你所說的「二元」。你是從字面上顯示文件的格式嗎?換句話說,在輸入時,字符是'0'還是'\ 0'?完成後,是否要讓文件包含兩個數字'3'和'0'或單個字符'\ 25','\ 30'或'\ 40'?
如果你正在處理每個輸入記錄中已知偏移量的單個字符,並且希望用結果中的單個字符替換它,事情就變得非常簡單:尋找文件中的右側偏移量,寫一個字節,尋找下一個偏移量,並繼續'直到你更新了所有的記錄。
如果輸入文件包含字符串,那麼當您更新該值時,它的長度將會(可能)發生變化,那麼您幾乎無法讀取數據,修改內存並將新數據寫回(通常是新文件)。這也很容易,但如果文件很大,速度可能會變慢。
如果你是在一個真正的程序中這樣做,我會考慮三次就自己做。我會考慮使用類似SQLite的東西來處理數據。這不僅可以讓你簡化你的代碼,而且使你的客戶的生活更加美好。它使用known/documented file format,所以其他工具可以處理數據,備份等。它支持事務,日誌記錄,回滾等。簡而言之,他們得到一個強大的解決方案,而不是另一個脆弱的問題。
這樣做與原始二進制輸入/輸出是一個真正的痛苦。記錄是否已經存在,或者您是否要創建它們? – JesseTG