2017-01-05 20 views
1

我寫尺寸3的載體,當我讀得大小爲4的矢量與上次指數爲索引的一個重複2C++,我得到重複的信息,當我讀到一個二進制文件

我的繼承人碼。

void IOManager::WriteBin(const string &filename, vector<userRank> highScorers, int rank) { 

    ofstream fsalida(filename, ios::out | ios::binary); 

    if (fsalida.is_open()) 
    { 
     for (int i = 0; i < highScorers.size();i++) { 
      fsalida.write(reinterpret_cast<char*>(&highScorers[i]), sizeof(highScorers[i])); 

     } 
     //highScorers.size() is 3 
     fsalida.close();  

    }else cout << "Unable to open file for writing\n"; 
} 

vector<userRank> IOManager::ReadBin(const string &filename) { 

    ifstream fentrada(filename, ios::in | ios::binary); 

    if (fentrada.is_open()) 
    { 

     vector<userRank>bestPlayers; 

     for (int i = 0; fentrada.good(); i++) { 
      userRank tempUser; 
      fentrada.read(reinterpret_cast<char*>(&tempUser), sizeof(tempUser)); 
      bestPlayers.push_back(tempUser); 

     } 
     //bestPlayers.size() is 4!!!!!! Im losing my mind 
     fentrada.close(); 

     return bestPlayers; 

    } 
    else cout << "Unable to open file for reading\n"; 

} 

這裏是我的UserRank結構

struct userRank 
{ 
    char userName [5]; 
    int score; 
}; 

由於某種原因,野生userRank apperars,沒有任何人知道爲什麼嗎?

+2

我不確定你到底想要什麼。而且你沒有發佈所有必要的知識來了解你的代碼。但我會大膽猜測你應該閱讀這個:[爲什麼是「while(!feof(file))」總是錯的?](http://stackoverflow.com/questions/5431941/why-is-while- FEOF文件,總是錯的)。 – giusti

+0

這不是問題,但不需要調用'fsalida.close()'和'fentrada.close()'。流的析構函數將關閉文件。 –

+0

在第一個循環中,確保您正在編寫'highScorers.size()'項目,但在讀取循環中,根據流標誌的條件循環。爲什麼不做一個實驗,並通過硬編碼第二個循環的項數來讀取相同數量的數據。 – PaulMcKenzie

回答

0

我建議重組讀取功能:

userRank tempUser; 
for (int i = 0; 
    fentrada.read(reinterpret_cast<char*>(&tempUser), sizeof(tempUser)); 
    i++) 
{ 
    bestPlayers.push_back(tempUser); 
} 

在互聯網上搜索「計算器C++爲什麼EOF中而不好」。

+0

Thaks!我遇到的問題是@MiltoxBeyond所說的,最後一次閱讀不成功。 – PauBlanes

相關問題