2017-05-20 4 views
0
typedef struct student 
{ 
    char name[10]; 
    int roll; 
    char subject[5]; 
    int mark; 
}STUDENT; 

, I는 다음과 같은 구조를 수정하고FREAD() 동작 리플 레니 잘못된 데이터 I 파일 학생 레코드를 저장 한 후 file.Now의 구조 위에 저장에 fwrite 및 FREAD 사용하고

typedef struct student 
{ 
    char name[10]; 

    char subject[5]; 
    int mark; 
}STUDENT; 

이제 파일에서 이전에 저장 한 오래된 레코드를 읽었습니다. fread()를 사용하여이 작업을 수행하고 있습니다. 문제는 데이터가 대상의 파일에서 제대로 읽히지 않아 구조의 데이터 멤버를 표시하는 것입니다.

답변

0

파일을 읽는 방법에 따라 다릅니다. 새 구조체에 fread을 넣고 sizeof(student)을 사용하는 경우 "롤"이 누락되어 있으므로 이전 롤 값은 새 구조의 subject[5]으로 읽습니다. fscanf을 사용하여 값을 각 필드에 명시 적으로로드 할 수 있습니다.

0

파일에 이전 구조의 데이터가 여전히 포함되어 있기 때문입니다. 총계는 10 + (+ 2) + 4 + 5 + (+ 3) +3 (+1) = 28 바이트입니다. 괄호 안의 값은 구조체 패딩입니다. 당신이 이전 형식으로 데이터를 포함하는 파일에서 새 구조체로 fread을 수행 할 때 subject의 마지막 5 번째 요소의 첫 번째 바이트가 될 것입니다 동안

int roll;의 4 바이트, char subject[5];의 첫 번째 4 바이트에 끝날 것 이전 subject. 유사한 아이디어가 mark 필드에도 적용됩니다.

이와 같은 구조를 읽고 쓰고 싶다면 (즉, 이진 복사본을 사용하여) 더 이상 사용하지 않더라도 이전 형식을 보존해야합니다. 더 나은 아이디어는 일종의 직렬화 라이브러리를 사용하는 것입니다. Google의 '프로토콜 버퍼'는 이러한 라이브러리의 많은 예 중 하나 일 뿐이며 이러한 문제의 해결 방법을 알 수 있습니다.

+0

감사합니다. 직렬화 라이브러리 시작에 대한 참고 자료를 제공해 주시면 큰 도움이 될 수 있습니까? – user5979363

+0

@ user5979363 언급 한 프로토콜 버퍼의 경우 다음 위치에서 좋은 가이드를 찾을 수 있습니다. https://developers.google.com/protocol-buffers/docs/cpptutorial –