C 언어에서 1바이트 정렬로 구조체를 파일에 저장하고 읽기

  • 4 minutes to read

구조체의 메모리 정렬을 조절하는 것은 크로스 플랫폼의 호환성 확보나 파일 크기 최적화 등의 이유로 중요하게 다루어질 수 있습니다. 이 아티클에서는 C 언어에서 #pragma pack 지시어를 사용하여 1바이트 정렬로 구조체를 정의하고, 해당 구조체를 파일에 저장하고 읽는 방법을 소개합니다.

1. 1바이트 정렬로 구조체 정의하기

#pragma pack 지시어를 사용하여 구조체의 정렬을 조절할 수 있습니다. 1바이트 정렬을 지정하려면 아래와 같이 코드를 작성합니다:

// 1바이트 크기로 정렬 지정
#pragma pack(push, 1)

typedef struct {
    int id;
    char name[50];
} Person;

// 정렬 지정 해제
#pragma pack(pop)

2. 구조체를 파일에 쓰기

구조체 인스턴스를 생성하고 초기화한 후 fwrite 함수를 사용하여 이를 파일에 저장합니다:

Person p1 = {1, "John Doe"};

FILE *file = fopen("person.dat", "wb");
if (file == NULL) {
    perror("파일을 열 수 없습니다");
    return 1;
}
fwrite(&p1, sizeof(Person), 1, file);
fclose(file);

fwrite 함수 시그니처:

size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);

3. 파일에서 구조체 읽기

저장된 구조체를 다시 읽어오려면 fread 함수를 사용합니다:

Person p2;

file = fopen("person.dat", "rb");
if (file == NULL) {
    perror("파일을 열 수 없습니다");
    return 1;
}
fread(&p2, sizeof(Person), 1, file);
fclose(file);

fread 함수 시그니처:

size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

4. 결과 확인하기

마지막으로, 파일에서 읽은 데이터를 출력하여 제대로 읽어왔는지 확인할 수 있습니다:

printf("ID: %d\n", p2.id);
printf("이름: %s\n", p2.name);

결론

#pragma pack 지시어를 활용하여 C 언어에서 구조체의 메모리 정렬을 조절하고, fwritefread 함수를 사용하여 구조체를 파일에 저장하고 읽어오는 것은 상당히 간단합니다. 다만, 정렬을 변경할 때는 성능상의 문제나 다른 예기치 않은 문제가 발생할 수 있으므로 사용시 주의가 필요합니다.

구조체 파일 입출력 퀴즈

1. #pragma pack 지시어는 무엇을 위해 사용되나요?

  • a) 파일 입출력 속도 향상
  • b) 메모리 정렬 조절
  • c) 코드 최적화
  • d) 에러 메시지 출력
  • 정답: b) 메모리 정렬 조절
    • 설명: #pragma pack은 구조체의 메모리 정렬을 조절하기 위해 사용됩니다.

2. 1바이트 정렬을 설정한 후, 원래의 정렬 설정으로 돌아가려면 어떻게 해야하나요?

  • a) #pragma pack(1)
  • b) #pragma pack(pop, 1)
  • c) #pragma pack(default)
  • d) #pragma pack(pop)
  • 정답: d) #pragma pack(pop)
    • 설명: #pragma pack(pop)을 사용하여 이전의 정렬 설정으로 돌아갈 수 있습니다.

3. 구조체를 파일에 쓸 때 사용하는 함수는 무엇인가요?

  • a) fread
  • b) fprintf
  • c) fopen
  • d) fwrite
  • 정답: d) fwrite
    • 설명: fwrite 함수를 사용하여 구조체의 정보를 파일에 저장할 수 있습니다.

4. 다음 중 fread 함수의 시그니처와 일치하는 것은?

  • a) void fread(void *ptr, size_t size, size_t count, FILE *stream);
  • b) void fread(const void *ptr, size_t size, FILE *stream);
  • c) size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
  • d) size_t fread(const void *ptr, size_t size, FILE *stream);
  • 정답: c) size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
    • 설명: fread 함수의 올바른 시그니처는 c 옵션에 나와있습니다.

5. 구조체의 이름을 파일에서 읽어와 출력하는 코드는 어떻게 됩니까?

  • a) printf("%s\n", p2);
  • b) printf("%s\n", p2.name);
  • c) print("이름: %s\n", p2.id);
  • d) printf("ID: %s\n", p2.name);
  • 정답: b) printf("%s\n", p2.name);
    • 설명: 구조체의 name 멤버 변수에 접근하여 이름을 출력할 수 있습니다.

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com