2012-08-05 77 views
1

我有一個以二進制格式存儲ints的文件。我正在用C++編寫一個函數,它接受int數據並將其插入到文件中的特定位置。將數據插入文件中的特定位置而不覆蓋在C++中

void AddData(int position, int data); 
  • 位置是數據必須插入的索引。
  • 數據是要插入的整型值。

代碼

void AddData(int position, int data) 
{ 

    fstream os;   
    char buff[4096]; 
    cnt1 = position; 
    cnt2+=(data_cnt-cnt1); // data_cnt is global var to cout the no. of data items 

    os.open("edata.dat", ios::out | ios::in | ios::binary); 

    os.seekg(0);     // start from beg 
    os.seekg(cnt1*sizeof(int));  // move to position at which data has to be inserted 
    os.read(reinterpret_cast<char*>(buff), cnt2*sizeof(int)); // read rest of file 
    os.seekg(cnt1*sizeof(int));  // move back to previous position 
    cout << os.tellg(); 
    os.write(reinterpret_cast<char*>(&data), sizeof(int)); //add data 
    os.write(reinterpret_cast<char*>(buff), cnt2*sizeof(int)); //write back the read data 
    data_cnt++; 
} 

當函數被調用一次,它顯示數據項被添加兩次。當第二次調用函數時,tellg()顯示-1。

搞不清楚,怎麼回事?

回答

0

老實說,我看不出有什麼不對,但是 - 原諒我那樣直截了當 - 你的編碼風格並沒有幫助!

有很多的東西是錯誤的,我認爲,在你的榜樣:

  1. 您使用全局變量來計算項目的數量。
  2. 你認爲不會有超過4096個字節的剩餘部分
  3. 您的reinterpret_cast是完全沒有必要的(寫「愛好者」是一樣的書寫「&的buff [0]」,給你一個char *直接)
  4. 你沒有做任何檢查的損失(超出例如 文件的結束位置?)

老實說,即使你做此代碼的工作,每個人誰都有人去維護它真的會恨你。 (我很抱歉聽起來很吝嗇,但是我必須在過去保持這些​​代碼的負載,如果某件事情在某處突然不起作用,因爲您切換到了64位操作系統,所以我不得不維護這些代碼)

足夠的講授,時間建議:

不爲什麼,簡單地說,做到以下幾點:

  • 從一開始複製源文件爲「位置」(檢查位置是在文件的界限!)到一個臨時文件。
  • 寫INT到temp文件
  • 複製源文件(從位置+ 1到EOF),以臨時文件(從位置+ 2)
  • 擦除edata.dat,重命名溫度到edata.dat

它更容易,更安全,更乾淨,可能一樣快。最重要的是:如果在結束之前發生了錯誤,您仍然可以使edata.dat處於穩定,無損狀態。

希望它可以幫助

0

從我可以告訴,CNT2是代表整數整型後插入的數目,對不對?

在這種情況下,它應該是cnt2 = data_cnt-cnt1,而不是cnt2 += data_cnt-cnt1。您應該可以創建這些局部變量,因爲它們不需要在調用之間存儲任何內容。

您第一次調用該函數時,您可能得到cnt2的巧合值正確。在第二次調用時,它被設置爲正確值的兩倍(因爲你正在遞增),所以讀取失敗,並且流進入錯誤狀態。

我不確定爲什麼可能會添加兩次數據。也許如果你修復了cnt2錯誤,它可能剛剛開始工作。

相關問題