2010-12-06 4 views
0

현재 입력 파일에서 이름을 읽으려고합니다. 파일은 .dat 파일입니다.C++ - Noob 이진 파일 IO 질문

내가 사용하여 데이터를 읽을 수 있습니다.

student_struct s; 
    string fileName; 

    fstream inFile; 
    inFile.open(fileName, ios::in | ios::binary); 


    inFile.read(reinterpret_cast<char*>(&s),sizeof(Student)); 

이 모두 잘 작동을 ...하지만 데이터를 읽어 사용하는 방법을 잘 모릅니다 나는 이것이 아주 초보자 질문입니다 알고 있습니다. 하지만 난 그냥 입력 파일에서 이름을 읽고 다른 문자열에 저장하고 싶습니다. 어떻게해야합니까?

+2

글쎄, 당신은 ** 단지 ** 같은 구조체를 읽을 수 있습니다. - 그러나 그것은 좋은 생각이 아닙니다. (예를 들어, 포인터가 그런 저장 /로드 후에 사용 가능하지 않을 수도 있습니다. 컴파일러 버전 또는 구조체 구성원이 오래된 저장된 데이터를 손상시킬 수 있음). –

답변

2

이 방법으로 파일을 읽는 것은 포인터가 전혀없는 구조체 (일반 변수 유형)에서만 작동합니다. 즉 테이블을 저장할 수 없다는 뜻입니다 (예 : 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 작업에 대해 항상 수행되어야하는 오류 처리가 포함되어 있지 않습니다.

0

구조체를 사용하려면 헤더 파일이나이 코드를 사용하기 전에 정의한 구조체를 사용 하시겠습니까?

그 다음 "S"의 데이터를 저장하고 당신이로 구조체를 정의하는 경우 경우 경우 :

student_struct 
{ 
    char firstname[FIRST_NAME_LEN]; 
    char lastname[LAST_NAME_LEN]; 
};

그럼 당신은에서를 읽고 있기 때문에 당신은 s.firstname;s.lastname를 사용하여 액세스 할 수 파일 while 루프를 사용하고 파일의 끝까지 읽을 수 있습니다.