Чтение вашего файла таким образом будет работать только для структуры, не имеющей указателей вообще - только простые типы переменных.Это означает, что вы не можете хранить там даже таблицу (например, char *).Если ваша структура Student более сложная, у вас должен быть какой-то протокол, в котором указано, как организован ваш файл.Например, вы можете использовать один или два байта, которые будут содержать размер строки.
Допустим, у нас есть следующее:
struct Student
{
std::string name;
int some_id;
std::string hair_color_description;
};
Теперь, когда мы хотим записать это в файл, мы можемdo
void saveToFile( Student s, fstream& f )
{
size_t strSize = s.name.size();
f.write( reinterpret_cast<char*>( &strSize ), sizeof(size_t) );
f.write( reinterpret_cast<char*>( s.name.data() ), strSize );
f.write( reinterpret_cast<char*>( &s.some_id ), sizeof(int) );
strSize = s.hair_color_description.size();
f.write( reinterpret_cast<char*>( &strSize ), sizeof(size_t) );
f.write( reinterpret_cast<char*>( s.hair_color_description.data() ), strSize );
}
И для загрузки
void loadFromFile( Student& s, fstream& f )
{
char *buffer = NULL;
size_t strSize;
f.read( reinterpret_cast<char*>( &strSize ), sizeof(size_t) );
buffer = new char[strSize];
f.read( buffer, strSize );
s.name = buffer;
delete[] buffer;
f.read( reinterpret_cast<char*>( &s.some_id ), sizeof(int) );
f.read( reinterpret_cast<char*>( &strSize ), sizeof(size_t) );
buffer = new char[strSize];
f.read( buffer, strSize );
s.hair_color_description = buffer;
delete[] buffer;
}
Конечно, этот код не содержит никакой обработки ошибок, которая всегда должна выполняться для любых действий ввода / вывода.