Итак, у меня есть этот код, я просто хочу написать свою структуру в файл, а затем прочитать с использованием другой переменной, потому что я хочу вернуть вектор 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 и т. Д., Но не с строками и сложными типами, знает ли кто-нибудь почему?
Часть проблемы заключается в том, что ваш 'userRank' имеет в ней' std :: string', который включает в себя выделенную кучу память, которая не будет доступна просто путем перехода к адресу экземпляра 'userRank' – AndyG
У сложных типов могут быть указатели. Адрес (значение указателя) может быть недействительным при следующей загрузке программы. Поэтому не храните указатели в двоичных файлах. –
Ах спасибо, так что единственный способ использовать массив символов? – PauBlanes