C 언어에서 1바이트 정렬로 구조체를 파일에 저장하고 읽기
추천 자료: ASP.NET Core 인증 및 권한 부여
구조체의 메모리 정렬을 조절하는 것은 크로스 플랫폼의 호환성 확보나 파일 크기 최적화 등의 이유로 중요하게 다루어질 수 있습니다. 이 아티클에서는 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 언어에서 구조체의 메모리 정렬을 조절하고, fwrite
및 fread
함수를 사용하여 구조체를 파일에 저장하고 읽어오는 것은 상당히 간단합니다. 다만, 정렬을 변경할 때는 성능상의 문제나 다른 예기치 않은 문제가 발생할 수 있으므로 사용시 주의가 필요합니다.
구조체 파일 입출력 퀴즈
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
멤버 변수에 접근하여 이름을 출력할 수 있습니다.
- 설명: 구조체의
추천 자료: .NET Blazor에 대해 알아보시겠어요? .NET Blazor 알아보기를 확인해보세요!