본문 바로가기
개념/혼자 공부하는 C언어

chapter 18) fread와 fwrite 함수의 차이

by kiseno 2024. 10. 7.
728x90
반응형
SMALL
#include <stdio.h>

int main(void){
    FILE *afp, *bfp;
    int num = 10, res;

    afp = fopen("a.txt", "wt");
    fprintf(afp, "%d", num);

    bfp = fopen("b.txt", "wb");
    fwrite(&num, sizeof(num), 1, bfp);

    fclose(afp);
    fclose(bfp);

    bfp = fopen("b.txt", "rb");
    fread(&res, sizeof(res), 1, bfp);
    printf("%d", res);

    fclose(bfp);
    return 0;
}

### 코드 설명

- `FILE *afp, *bfp;`는 파일 작업에 사용될 파일 포인터 `afp`와 `bfp`를 선언합니다.
- `int num = 10, res;`는 파일에 쓸 정수 `num`과 파일로부터 읽을 정수를 저장할 변수 `res`를 선언하고, `num`을 10으로 초기화합니다.
- `afp = fopen("a.txt", "wt");`는 "a.txt" 파일을 텍스트 쓰기 모드로 엽니다. `"wt"` 모드는 텍스트 모드에서 쓰기를 의미합니다.
- `fprintf(afp, "%d", num);`는 `afp` 파일 포인터가 가리키는 파일에 `num` 변수의 값을 텍스트 형식으로 씁니다.
- `bfp = fopen("b.txt", "wb");`는 "b.txt" 파일을 바이너리 쓰기 모드로 엽니다. `"wb"` 모드는 바이너리 모드에서 쓰기를 의미합니다.
- `fwrite(&num, sizeof(num), 1, bfp);`는 `bfp` 파일 포인터가 가리키는 파일에 `num` 변수의 값을 바이너리 형식으로 씁니다. 여기서 `&num`은 `num`의 메모리 주소, `sizeof(num)`은 `num`의 크기, `1`은 쓰기를 수행할 항목의 개수입니다.
- `fclose(afp);`와 `fclose(bfp);`는 각각 열린 "a.txt"와 "b.txt" 파일을 닫습니다.
- 파일을 닫은 후 "b.txt" 파일을 바이너리 읽기 모드로 다시 엽니다: `bfp = fopen("b.txt", "rb");`.
- `fread(&res, sizeof(res), 1, bfp);`는 "b.txt" 파일로부터 `res` 변수에 바이너리 형식으로 값을 읽어옵니다.
- `printf("%d", res);`는 읽어온 `res` 값을 출력합니다.
- 마지막으로 `fclose(bfp);`는 "b.txt" 파일을 닫습니다.

### 텍스트 모드와 바이너리 모드의 차이

- 텍스트 모드(`"wt"`)로 파일에 쓰기를 수행하면, 숫자 `10`은 문자열 형태로 저장됩니다. 예를 들어, `10`이라는 숫자는 '1'과 '0'이라는 두 문자로 파일에 쓰여집니다.
- 바이너리 모드(`"wb"`)로 파일에 쓰기를 수행하면, 숫자 `10`은 해당 숫자를 나타내는 바이트(또는 바이트들)로 저장됩니다. 따라서 이후 바이너리 모드(`"rb"`)로 읽기를 수행하면 정확히 같은 숫자 값 `10`을 얻을 수 있습니다.

이 예제는 파일에 데이터를 쓰고 읽는 두 가지 다른 모드(텍스트 모드와 바이너리 모드)를 보여주며, 특히 바이너리 모드를 사용할 때 데이터가 어떻게 저장되고 다시 정확히 같은 형태로 읽혀지는지를 설명합니다.

728x90
반응형
LIST