프로그래밍/C

[C언어] 12.파일 입출력 (fopen, fclose, fread, fwrite)

록스타★ 2024. 10. 25. 09:45
반응형

1. 파일 입출력의 기본 개념

- 파일 입출력은 주로 파일을 열고 데이터를 읽거나 쓴 후 파일을 닫는 순서로 진행

- 파일을 다루기 위해서는 먼저 해당 파일을 열어야 하며, 이를 위해 fopen 함수를 사용 

- 파일 작업이 끝나면 반드시 파일을 닫아야 하며, fclose 함수 사용

 

fopen

- fopen 함수는 파일을 열 때 사용하는 함수

- 파일의 경로와 모드를 인자로 받고, 모드는 파일 읽기, 쓰기, 추가 등의 방식으로 나타냄

- filename : 열고자 하는 파일의 이름(경로)

- mode : 파일을 열 때의 모드

 > r : 읽기 전용으로 파일을 열고, 파일이 존재하지 않으면 NULL 반환

 > w : 쓰기 전용으로 파일을 열고, 파일이 존재하지 않으면 새 파일 생성, 존재하면 파일의 내용을 모두 삭제 한 후 다시 작성

 > a : 추가 모드로 파일을 열고, 파일이 존재하지 않으면 새 파일을 생성, 존재하면 파일 끝에 데이터 추가

 > r+ : 읽기 및 쓰기가 가능한 모드로 파일을 열고, 파일이 존재하지 않으면 NULL을 반환

 > w+ : 읽기 및 쓰기가 가능한 모드로 파일을 열고, 파일이 존재하지 않으면 새 파일을 생성, 존재하면 내용을 모두 삭제

 > a+ : 읽기 및 쓰기가 가능한 모드로 파일을 열고, 파일이 존재하지 않으면 새 파일을 생성, 존재하면 파일 끝에 데이터를 추가 

FILE *open(const char *filename, const char *mode);

 

fclose 

- 파일을 다 사용한 후에는 반드시 fclose 함수로 파일을 닫아야 함

- 파일을 닫지 않으면 데이터가 손실되거나 파일이 손상

- fclose는 파일 포인터를인자로 받아 파일을 닫으며, 성공적으로 닫히면 0, 실패하면 EOF 반환 

int fclose(FILE *stream);

 

 

 

2. 파일 읽기와 쓰기

- 파일을 열었다면 이제 데이터를 읽거나 쓸 수 있다.

- C언어에서fscanf와 fprintf 함수를 사용하여 텍스트 파일 처리

 

fscanf 함수

- fscanf 함수는 파일에서 데이터를 읽어올 때 사용, scanf 함수와 비슷한 방식으로 작동

- stream : 파일 포인터

- format : 읽어올 데이터의 형식을 지정하는 포맷 문자열

int fsacnf(FILE *stream, const char *format);

  

fscanf 예시

FILE *file = fopen("data.txt", "r");
int num;
char str[100];

if (file != NULL) {
    fscanf(file, "%d %s", &num, str);
    printf("Number: %d, String: %s\n", num, str);
    fclose(file);
}

 

 

fprintf 함수

- fprintf 함수는 파일에 데이터를 출력할 때 사용, printf와 비슷한 방식

- stream : 파일 포인터

- format : 읽어올 데이터의 형식을 지정하는 포맷 문자열

int fprintf(FILE *stream, const char *format);

 

 

fprintf 출력 예시

FILE *file = fopen("output.txt", "w");
int num = 10;
char str[] = "Hello";

if (file != NULL) {
    fprintf(file, "%d %s\n", num, str);
    fclose(file);
}

 

 

 

3. 텍스트 파일과 이진 파일의 차이

- 파일 입출력에서는 텍스트 파일과 이진 파일로 구분

 

텍스트 파일

- 텍스트 파일은 사람이 읽을 수 있는 ASCII 또는 유니코드 문자들로 구성된 파일

- fscanf, fprintf와 같은 함수들은 주로 텍스트 파일을 다루는 데 사용

- 파일을 열 때 r 또는 w 모드 사용

 

이진 파일

- 이진 파일은 숫자, 구조체 등의 데이터를 그대로 바이너리 형식으로 저장

- 사람이 직접 읽기는 어렵지만, 프로그램에서는 데이터를 더 효율적으로 저장하고 읽음.

- 이진 파일을 처리할 때는 fread, fwrite 함수를 사용, 파일을 열 때 rb, wb 모드 사용

// 이진 파일에 데이터 쓰기
FILE *file = fopen("data.bin", "wb");
int numbers[] = {1, 2, 3, 4, 5};

if (file != NULL) {
    fwrite(numbers, sizeof(int), 5, file);
    fclose(file);
}

// 이진 파일에서 데이터 읽기
FILE *file = fopen("data.bin", "rb");
int numbers_read[5];

if (file != NULL) {
    fread(numbers_read, sizeof(int), 5, file);
    fclose(file);
}

 

 

 

4. 파일 입출력의 주요 포인트 요약

- 파일 열기(fopen) : 함수로 파일을 열고, 모드에 따라 읽기 또는 쓰기 작업을 수행
- 파일 닫기(fclose) : 함수로 파일을 닫아 작업을 마무리
- 파일 읽기/쓰기 : fscanf, fprintf는 텍스트 파일을 다루고, fread, fwrite는 이진 파일을 다룸
- 텍스트 파일 vs 이진 파일 : 텍스트 파일은 사람이 읽을 수 있지만, 이진 파일은 바이너리 데이터를 더 효율적으로 처리

반응형