このようにファイルを読み込むと、ポインタを一切持たない構造体に対してのみ機能します。単純な変数型です。つまり、そこにテーブルを格納することはできません(例えば、char *)。あなたの学生の構造がもっと複雑な場合は、ファイルがどのように組織されているかを示す何らかのプロトコルが必要です。たとえば、文字列サイズを含む1つまたは2つのバイトを使用できます。
のは、私たちは次のことを持っているとしましょう:
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;
}
をロードするためのファイルにこれを書きたいときこのコードには、I/Oアクションに対して常に実行されるエラー処理は含まれていません。
さて、あなたはそういう構造体を読み込めるかもしれませんが、おそらくそれは良い考えではないでしょう(例えば、ポインタがそのようなセーブ/ロードの後に使用できるようにならない、コンパイラのバージョンまたは構造体メンバが古い保存データを破損する可能性があります)。 –