2011-05-21 39 views
1

我正在處理C++中的文件問題,我無法解決這個問題。我正在管理一個帶有寄存器的文件,我試圖做「排序插入」,西班牙文是「Insercciónordenada」,但我不知道翻譯成英文。我試圖做的是在文件末尾打開文件,並將寄存器與我想要插入文件的寄存器進行比較。每個大於新的寄存器都將一個寄存器的位置移動到文件末尾。當比較結果返回新值小於當前選擇的值時,我將新寄存器寫入正確的位置。seekp(),seekg(),read()和write()在同一個文件上的問題

我的具體問題是文件中的最後一個寄存器被讀取2次,因爲它,寄存器被寫入2次。

我想複製我編寫的代碼,但名稱是用西班牙語,代碼中包含很多代碼段來管理char * s和結構體之間的錯誤和轉換......這是一團糟,它只是混淆我們。

我想有人會遇到同樣的情況,我會感謝網絡上的例子或一些關於如何在同一個文件上使用seekp和seekg的文章。

非常感謝!

更多或更少的代碼:

int readPosition, writePosition; 

readPosition = // Byte where the last register starts in the file. 
writePosition = readPosition + registerSize; 

f->seekg(readPosition,ios::beg); 

oldReg = new char[registerSize]; 
f->read(oldReg,registerSize); 
f->seekp(writePosition,ios::beg); 

while() { // if cadena < new register 
      // For writing, I need to move the reading pointer after the writing pointer 
    f->seekg(readPosition + 2*registerSize,ios::beg); 
     f->write(oldReg,registerSize); 

     readPosition -= registerSize; 
    writePosition -= registerSize; 

     f->seekg(readPosition,ios::beg); 
     f->seekp(writePosition,ios::beg); 

       delete oldReg; 
       oldReg = new char[registerSize]; 

     f->read(oldReg,registerSize); 
    } 

delete oldReg; 

f->seekp(writePosition,ios::beg); 
f->seekg(writePosition + registerSize,ios::beg); 

f->write(newRegister,registerSize); 

這不是真正的代碼,但我什麼方法做。我希望你注意到我如何使用seekp()和seekg(),因爲我不確定我使用它們的方式。我在seekp和seekg上遇到了幾個問題,我注意到這兩個指針非常匹配。

+1

你如何循環瀏覽文件?可能你到達文件的末尾,但不是在它之後,第一次,所以EOF還沒有遇到。 – 2011-05-21 16:07:14

+2

這可能是幫助http://stackoverflow.com/questions/6029875/problem-with-eof-when-determine-stream-end – 2011-05-21 16:09:13

+3

似乎正確的翻譯是「插入排序」(http://en.wikipedia。 org/wiki/Insertion_sort) – 2011-05-21 16:40:25

回答

3

這不起作用

f->seekg(readPosition,ios::beg); 
f->seekp(writePosition,ios::beg); 

的文件只有一個位置。當你需要他們時,你必須做你的尋求,當從閱讀到寫作或反之亦然。

+0

謝謝,我不明白我什麼時候閱讀它,但我意識到我必須在每一個操作之前移動任何指針 – honnix 2011-05-23 20:17:52

相關問題