Nagie's DevStory

[C] 45. 파일 입출력 ( 2 ) 본문

Programming/C

[C] 45. 파일 입출력 ( 2 )

Nagie 2023. 10. 9. 00:35
728x90

우선 파일의 형식과 상관없이 공용으로 사용되는 함수들부터 알아보도록 하자.

 

//파일 형식과 상관없이 공용으로 사용하는 함수

FILE *fopen(const char* filename,const char* mode);
int fclose(FILE* stream);
int feof(FILE* stream);
int fscanf(FILE* s, const char* format, args...);
int fprintf(FILE* s,const char* format, args...);

 

1. fopen

 

fopen 함수는 C에서 파일을 열 때 사용되며 파일 포인터를 반환한다.

fopen은 파일 이름과 열기 모드를 인수로 받으며 열기 모드는 파일을 어떤 식으로 읽을 건지 지정하는데 사용된다.

아래는 파일을 쓰기 모드로 열어서 데이터를 파일에 쓰는 방법의 예시다.

 

#include <stdio.h>

int main() {
    FILE *filePointer;
    // 파일을 "쓰기 모드"로 열기 (파일이 없으면 생성하고, 있으면 덮어씀)
    filePointer = fopen("example.txt", "w");
    
    if (filePointer == NULL) {
        printf_s("파일 열기에 실패했습니다.");
        return 1;
    }

    // 파일에 데이터 쓰기
    fprintf(filePointer, "Hello~ ");

    // 파일 닫기
    fclose(filePointer);
}

 

위의 예제에서는 example.txt 파일을 쓰기 모드로 열어 파일 포인터를 얻고 fprintf 함수를 사용해 데이터를 파일에 쓰며

해당 디렉토리에 example.txt가 이미 존재할 경우 파일을 덮어쓴다.

 

다음은 파일을 읽기 모드로 열어서 파일에서 데이터를 읽는 예시이다.

 

#include <stdio.h>

int main() {
    FILE *filePointer;
    // 파일을 "읽기 모드"로 열기
    filePointer = fopen("example.txt", "r");
    
    if (filePointer == NULL) {
        printf_s("파일 열기에 실패했습니다.");
        return 1;
    }

    char buffer[100];
    // 파일에서 데이터 읽기
    fgets(buffer, sizeof(buffer), filePointer);
    printf_s("파일 내용: %s", buffer);

    // 파일 닫기
    fclose(filePointer);
}

 

위의 예제는 example.txt 파일을 읽기 모드로 열어 파일 포인터를 얻고 fgets 함수를 사용해 파일에서 데이터를 읽어온다.

fopen함수는 파일 열기 모드에 대한 다양한 옵션을 지원하기에 원하는 작업에 따라 알맞는 모드를 사용할 수 있다.

지원하는 모드는 아래와 같다.

 

파일 열기 모드 설명
r

(Read)

파일 읽기 모드

파일이 존재하지 않으면 열기 실패

파일의 내용을 읽을 수 있지만 수정을 안됨

w

(Write)

파일 쓰기 모드

파일이 이미 존재하면 기존의 파일에다 덮어씀

파일의 내용을 쓸 수 있음 

파일을 생성하거나 덮어쓸때 사용

a

(Append)

파일 데이터 추가 모드

파일이 이미 존재하면 파일 끝에 데이터를 이어서 작성

파일의 내용을 쓸 수 있음

파일이 없으면 새로운 파일을 생성함

rb

(Read Binary)

바이너리 파일 읽기 모드

바이너리 데이터를 파일에 쓸 수 있지만 수정은 안됨

wb

(Write Binary)

바이너리 파일 읽기 모드

바이너리 데이터를 파일에 쓸 수 있음

ab

(Append Binary)

바이너리 파일 추가 모드

바이너리 파일 끝에 바이너리 데이터를 추가할 수 있음

r+

(Read and Write)

파일 읽기 / 쓰기 모드

파일의 내용을 읽고 수정할 수 있음

파일이 존재하지 않으면 열기 실패

w+

(Write and Read)
파일 쓰기 / 읽기 모드

파일이 이미 존재하면 기존의 파일에다 덮어씀

파일의 내용을 읽고 쓸 수 있음


 

 

 

2. fclose

 

fclose 함수는 파일을 닫는 데 사용되며 파일을 열고 작업한 후에는 항상 파일을 닫아줘야 한다.

fclose 함수는 파일 포인터를 인수로 받아 파일을 닫으며 아래는 fclose의 사용 예시이다.

 

// 파일 닫기
if (fclose(filePointer) == 0) {

    printf_s("파일을 성공적으로 닫았습니다.");
    
} else {

    printf_s("파일 닫기에 실패했습니다.");
}

 

파일을 닫는 건 파일을 올바르게 종료하고 리소스를 반환하는 중요한 단계이며

파일을 열고 난 뒤 닫지 않으면 파일이나 리소스에 대한 메모리 릭이 발생할 수 있으므로

항상 파일을 사용하고 난 뒤에 fclose 함수를 사용해 파일을 닫아줘야 한다.

 

 

3. feof

 

feof는 파일에서 읽기 작업을 수행할 때 파일의 끝(EOF , End of File)에 도달했는지 검사하는데 사용된다.

마치 문자열의 끝을 알기 위해 널 문자(\0)를 비교하는 것과 유사하며

파일의 끝에 도달하면 0이 아닌 값을 반환한다.

아래는 feof를 사용하는 간단한 예시이다.

 

// 파일에서 데이터 읽기
while (!feof(filePointer)) {
    
    fgets(buffer, sizeof(buffer), filePointer);
       
       if (!feof(filePointer)) {
           
           printf_s("파일에서 읽은 데이터: %s", buffer);
        }
}

// 파일 닫기
fclose(filePointer);

 

 

4.fscanf

 

fscanf는 파일에서 형식화된 데이터를 읽어오는 데 사용된다.

이 함수는 파일 포인터와 형식 문자열을 인수로 받으며 형식 문자열에 따라 파일에서 데이터를 읽어 변수에 저장한다

다음은 fscanf를 사용하는 예시이다.

 

우선 data.txt에 아래와 같은 내용이 있다고 가정하자.

 

John 25 80.5
Alice 30 65.2
Bob 22 75.0

 

data.txt 파일에서 이름, 나이 , 키를 읽어와 변수에 저장하려면 fscanf를 아래의 코드처럼 사용하면 된다.

 

#include <stdio.h>

int main() {
    FILE *filePointer;
    filePointer = fopen("data.txt", "r");
    
    if (filePointer == NULL) {
        printf_s("파일 열기에 실패했습니다.");
        return 1;
    }

    char name[50];
    int age;
    float height;

    // 파일에서 데이터 읽기
    while (fscanf(filePointer, "%s %d %f", name, &age, &height) == 3) {
        printf_s("이름: %s, 나이: %d, 키: %.2f\n", name, age, height);
    }

    // 파일 닫기
    fclose(filePointer);
}

 

위의 코드에서는 fscanf 함수를 사용해 파일에서 형식화된 데이터를 읽어온다.

우리가 일반적으로 사용자 입력을 받을 때 사용하는 scanf와 동일하다

다만 입력을 받는 상대가 사용자냐 파일이냐 차이일 뿐이다.

 

 

5. fprintf

 

fprintf는 파일에 형식화된 데이터를 쓰는 데 사용된다.

이 함수는 파일 포인터와 형식 문자열 그리고 형식 문자열에 따라 파일에 쓸 변수들을 인수로 받는다.

아래는 fprintf의 사용 예시이다.

 

#include <stdio.h>

int main() {
    FILE *filePointer;
    filePointer = fopen("output.txt", "w");
    
    if (filePointer == NULL) {
        printf_s("파일 열기에 실패했습니다.");
        return 1;
    }

    char name[] = "John";
    int age = 25;
    float height = 80.5;

    // 파일에 데이터 쓰기
    fprintf(filePointer, "이름: %s, 나이: %d, 키: %.2f\n", name, age, height);

    // 파일 닫기
    fclose(filePointer);
}

 

위의 코드를 실행하면 output.txt 파일에 다음과 같은 내용이 저장된다.

 

이름: John, 나이: 25, 키: 80.50

 

 

728x90
Comments