2014-12-10 1 views
2

이진 파일 I/O를 테스트하고있었습니다. 그래서, 작은 프로그램을 만들어 연습 :fwrite는 쓰레기를 출력하고, fread는 쓰레기 구조를 읽습니다.

을 main.c :

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "person.h" 

int main() 
{ 
    struct person me; 
    struct person cpy_me; 
    FILE *dataWrite, *dataRead; 

    strcpy(me.fname, "john"); 
    strcpy(me.lname, "smith"); 
    me.age = 12; 

    printf("%s %s %d\n", me.fname, me.lname, me.age); 

    dataWrite = fopen("people.bin", "wb"); 
    if (fwrite(&me, sizeof(struct person), 1, dataWrite) != 1) 
     fprintf(stderr, "Error!\n"); 
    printf("Wrote to the file\n"); 

    dataRead = fopen("people.bin", "rb"); 

    fread(&cpy_me, sizeof(struct person), 1, dataRead); 
    printf("%s->Fname\n", cpy_me.fname); 
    printf("%s->Lname\n", cpy_me.lname); 
    printf("%d->Age\n", cpy_me.age); 

    fclose(dataWrite); 
    fclose(dataRead); 

    return 0; 
} 

person.h :

smith ÿÿb¸tÄ[½tà@ john @ à@          
:

#ifndef PERSON_H_INCLUDED 
#define PERSON_H_INCLUDED 

#define MAXFIRST 10 
#define MAXLAST  20 

struct person 
{ 
    char lname[MAXLAST], fname[MAXFIRST]; 
    int age; 
}; 
#endif // PERSON_H_INCLUDED 

이 파일 people.bin 등장 무엇인가

fread의 결과가 표시되면 다음과 같이 표시됩니다.

enter image description here 바이너리 파일에서 사람이 읽을 수있는 형식으로 표시하지 않지만 다음과 같이 표시되어 있습니까? 나이가 보이지 않기 때문에 나는 그렇게 생각하지 않으며, fread은 쓰레기를 읽음을 보여주고 있습니다.

+3

fclose (data); data = fopen ("people.bin", "rb"); fread (& cpy_me, ...' – BLUEPIXY

+0

이제 나는 이것을 알게되었다 :'smith ÿÿb¸tÄ [½tà @ john @ à @ ' – stackptr

+0

그것은 나에게 잘 작동 – BLUEPIXY

답변

2

이 코드 단편에는 다음과 같은 두 가지 개별적인 문제점이 있습니다. 첫째, BLUEPIXY가 이미 주석 처리되었으므로 파일을 닫은 후 다시 열거 나 다시 되 감아 다시 읽어야합니다. 그렇지 않으면 fread()이 실패하고 프로그램에서 오류를 검사하지 않기 때문에 cpy_me 내부의 문자열을 인쇄하려고 시도 할 때까지 알 수 없습니다.이 문자열은 초기화되지 않은 상태로 남아 있습니다.

두 번째 문제가 발생합니다. 구조체 me을 초기화해야합니다 (예 : 0). struct person me = {"", "", 0}; 바이너리 파일에서 볼 수있는 쓰레기를 처리해야합니다. C의 구조체는 전역 변수가 아니면 자동으로 컴파일러에 지시하지 않으면 자동으로 초기화되지 않습니다.

제쳐두고 : 구조체가 다른 아키텍처에서 다른 메모리 레이아웃을 가질 수 있으므로 이식성이 없다는 점에 유의하십시오 (이를 보려면 32 비트 및 64 비트 모드에서 다시 컴파일 해보고 비교해보십시오). 프로그램이 생성하는 바이너리 파일).