2017-01-04 1 views
0

Итак, у меня есть этот код, я просто хочу написать свою структуру в файл, а затем прочитать с использованием другой переменной, потому что я хочу вернуть вектор userRankings, когда чтение.Программа перестала работать при попытке file.read() к новой переменной

Here'es мой записи/чтения

void IOManager::WriteBin(const string &filename, userRank u1) { 

    ofstream fsalida(filename, ios::out | ios::binary); //obrim un archiu per escriure en binari i de tipo append per poder escriure al final i no xafar-ho tot cada cop 

    if (fsalida.is_open()) 
    { 
     fsalida.write(reinterpret_cast<char*>(&u1), sizeof(u1)); 
     fsalida.close(); 


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

} 

void IOManager::ReadBin(const string &filename) { 



    ifstream fentrada(filename, ios::in | ios::binary); //ate per posarnos al final del archiu i tenir el tamany 

    if (fentrada.is_open()) 
    { 
     userRank tempUser; 
     fentrada.read(reinterpret_cast<char*>(&tempUser), sizeof(tempUser)); 
     fentrada.close(); 

     cout << sizeof(tempUser) << endl; 

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

} 

И мой userRank:

struct userRank 
{ 
    std::string userName; 
    int score; 
}; 

линия, которая не является fentrada.read (reinterpret_cast (& tempUser), SizeOf (tempUser));

Пожалуйста, помогите, это похоже на работу с ints, chars и т. Д., Но не с строками и сложными типами, знает ли кто-нибудь почему?

+2

Часть проблемы заключается в том, что ваш 'userRank' имеет в ней' std :: string', который включает в себя выделенную кучу память, которая не будет доступна просто путем перехода к адресу экземпляра 'userRank' – AndyG

+0

У сложных типов могут быть указатели. Адрес (значение указателя) может быть недействительным при следующей загрузке программы. Поэтому не храните указатели в двоичных файлах. –

+0

Ах спасибо, так что единственный способ использовать массив символов? – PauBlanes

ответ

0

Использование reinterpret_cast таким образом является опасным и может сломаться по многим причинам. В этом конкретном случае причина, по которой он не работает, заключается в том, что struct userRank содержит std::string, который не является a POD type (простой старый тип данных). Это означает, что вы не можете просто установить его биты и ожидать получить правильное состояние. std::string содержит указатель на выделенную память. Установка битов std::string не выделяет память, которую он ожидает найти по адресу этого указателя.

Быстрое исправление (условно говоря) заключается в использовании std::array вместо std::string для хранения userName. Правильное исправление - писать функции, которые будут читать/записывать состояние структуры в/из члена файла членом.

+0

чем вы, я буду использовать быстрое исправление, sry guys i will сделайте это правильно в какой-то момент. Я использовал char * вместо строки btw. – PauBlanes

Смежные вопросы