2017-01-05 7 views
1

Im писать вектор размера три, и когда я прочитал я получить вектор размера 4 с последним индексом является дубликатом индекса 2.с ++ я получить дублированную информацию, когда я прочитал двоичный файл

Heres моего код.

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); 
} 

Поиск в интернете для «StackOverflow C++ почему ВФ в то время как это плохо».

+0

Thaks! Проблема у меня была, что @MiltoxBeyond говорил, последнее чтение не увенчалось успехом. – PauBlanes