Чтение файла таким образом будет работать только для структуры, не имеющей указателей - просто переменных типов. Это означает, что вы не можете хранить даже таблицу там (например, char *). Если ваша структура Student более сложна, у вас должен быть какой-то протокол, говорящий, как ваш файл организован. Например, вы можете использовать один или два байта, которые будут содержать размер строки.
Допустим, мы имеем следующее:
struct Student
{
std::string name;
int some_id;
std::string hair_color_description;
};
Теперь, когда мы хотим, чтобы написать это в файл, мы можем сделать
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;
}
Конечно этот код не содержит обработки ошибок, которые всегда должны выполняться для любых операций ввода-вывода.
Ну, вы ** можете ** просто читать в такой структуре, но это, вероятно, не очень хорошая идея (например, такие вещи, как указатели, не будут использоваться после сохранения/загрузки, как это; версия компилятора или элементы структуры могут сломать старые сохраненные данные). – 2010-12-06 04:02:14