이 방법으로 파일을 읽는 것은 포인터가 전혀없는 구조체 (일반 변수 유형)에서만 작동합니다. 즉 테이블을 저장할 수 없다는 뜻입니다 (예 : char *). 학생 구조가 좀 더 복잡한 경우 파일 구성 방법을 나타내는 프로토콜이 있어야합니다. 예를 들어, 문자열 크기를 포함 할 1 바이트 또는 2 바이트를 사용할 수 있습니다. 이제 우리는 파일이 작성 할 때 우리가
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);
}
을 할 수
struct Student
{
std::string name;
int some_id;
std::string hair_color_description;
};
물론
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 작업에 대해 항상 수행되어야하는 오류 처리가 포함되어 있지 않습니다.
글쎄, 당신은 ** 단지 ** 같은 구조체를 읽을 수 있습니다. - 그러나 그것은 좋은 생각이 아닙니다. (예를 들어, 포인터가 그런 저장 /로드 후에 사용 가능하지 않을 수도 있습니다. 컴파일러 버전 또는 구조체 구성원이 오래된 저장된 데이터를 손상시킬 수 있음). –