c언어/C언어 개념정리

C언어의 표준 입출력 라이브러리 <studio.h> 3. fopen()

코드라니(CODERANY) 2024. 12. 3. 13:51

C 언어의 <stdio.h> 라이브러리는 표준 입출력 기능을 제공하는 함수들을 포함하고 있습니다. 이 라이브러리를 사용하면 콘솔과 파일 간의 데이터 입출력을 손쉽게 처리할 수 있습니다. 

 

다른 입출력 라이브러리보기

더보기
닫기

1. printf() 

2. scanf()

3. fopen() :  현재글

4. fclose()

5. fgets()

6. fputs()

7. fprintf()

8. fscanf()

 

1. fopen() 함수의 정의

fopen() 함수는 프로그램에서 파일을 열고, 해당 파일에 대한 포인터를 반환합니다. 

이를 통해 파일에 대한 읽기, 쓰기, 위치 지정 등의 작업을 수행할 수 있습니다.

 

형식

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

filename: 열고자 하는 파일의 경로와 이름을 지정하는 문자열입니다.
mode: 파일을 열 때 사용할 모드를 지정하는 문자열입니다. 이 모드는 파일을 어떻게 사용할지를 정의합니다.

2. 주요 기능

파일 열기: 지정된 파일을 열고, 파일에 대한 포인터를 반환합니다.
오류 처리: 파일 열기에 실패할 경우 NULL 포인터를 반환합니다.
파일 모드 지정: 다양한 모드를 통해 파일을 읽거나 쓸 수 있습니다.

 

3. 파일 모드

3.1. 일반 파일 모드

"r": 읽기 모드. 파일이 존재해야 하며, 파일의 내용을 읽을 수 있습니다.
"w": 쓰기 모드. 파일이 존재하면 내용을 삭제하고 새로 작성합니다. 파일이 없으면 새로 생성합니다.
"a": 추가 모드. 파일의 끝에 데이터를 추가합니다. 파일이 없으면 새로 생성합니다.
"r+": 읽기 및 쓰기 모드. 파일이 존재해야 하며, 파일의 내용을 읽고 수정할 수 있습니다.
"w+": 읽기 및 쓰기 모드. 파일이 존재하면 내용을 삭제하고 새로 작성합니다. 파일이 없으면 새로 생성합니다.
"a+": 읽기 및 추가 모드. 파일의 끝에 데이터를 추가할 수 있으며, 파일을 읽을 수 있습니다. 파일이 없으면 새로 생성합니다.



3.2. 이진 파일 모드

"rb": 이진 파일을 읽기 위한 모드. 파일이 존재해야 하며, 내용을 읽을 수 있습니다.

"wb": 이진 파일을 쓰기 위한 모드. 파일이 존재하면 내용을 삭제하고 새로 작성합니다. 파일이 없으면 새로 생성합니다.

"ab": 이진 파일에 데이터를 추가하기 위한 모드. 파일의 끝에 데이터를 추가합니다. 파일이 없으면 새로 생성합니다.

"rb+": 이진 파일을 읽기 및 쓰기 위한 모드. 파일이 존재해야 하며, 내용을 읽고 수정할 수 있습니다.

"wb+": 이진 파일을 읽기 및 쓰기 위한 모드. 파일이 존재하면 내용을 삭제하고 새로 작성합니다. 파일이 없으면 새로 생성합니다.

"ab+": 이진 파일을 읽기 및 추가하기 위한 모드. 파일의 끝에 데이터를 추가할 수 있으며, 파일을 읽을 수 있습니다. 파일이 없으면 새로 생성합니다.

 

이진파일 :데이터가 이진 형식으로 저장된 파일을 의미합니다. 파일의 내용이 0과 1로 이루어진 형식입니다.

 

4. 사용 예제

4.1 파일 읽기

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r"); // example.txt 파일을 읽기 모드로 열기
    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    // 파일 작업 수행
    fclose(file); // 파일 닫기
    return 0;
}

fopen() 함수는 "example.txt" 파일을 읽기 모드로 열고, 파일 포인터를 반환합니다.

만약 파일이 열리지 않으면 오류 메시지를 출력합니다.

 

4.2 파일쓰기

#include <stdio.h>

int main() {
    FILE *file = fopen("output.txt", "w"); // output.txt 파일을 쓰기 모드로 열기
    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    fprintf(file, "Hello, World!\n"); // 파일에 문자열 쓰기
    fclose(file); // 파일 닫기
    return 0;
}

output.txt 파일을 쓰기 모드로 열고, "Hello, World!\n" 문자열을 파일에 기록합니다.

 

4.3 파일 추가

#include <stdio.h>

int main() {
    FILE *file = fopen("output.txt", "a"); // output.txt 파일을 추가 모드로 열기
    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    fprintf(file, "Appending some text...\n"); // 파일 끝에 문자열 추가
    fclose(file); // 파일 닫기
    return 0;
}

output.txt 파일을 추가 모드로 열고, 기존 내용 뒤에 "Appending some text...\n" 문자열을 추가합니다.

 

5. 오류 처리

#include <stdio.h>

int main() {
    FILE *file = fopen("nonexistent.txt", "r"); // 존재하지 않는 파일 열기
    if (file == NULL) {
        perror("Error opening file"); // 오류 메시지 출력
        return 1;
    }

    fclose(file);
    return 0;
}

perror() 함수를 사용하여 오류 메시지를 출력합니다. perror()는 지정된 문자열과 함께 errno 변수를 참조하여 오류에 대한 설명을 출력합니다.

참고 : errno는 C 언어에서 오류 발생 시 오류 번호를 저장하는 전역 변수입니다. 특정한 오류가 발생하면, 해당 오류에 대한 정보를 errno에 설정합니다. 위의 코드에서는 fopen 함수가 파일을 열지 못했을 때 file 포인터가 NULL이 됩니다. 이 경우, perror 함수를 사용하여 오류 메시지를 출력하는데, perror는 내부적으로 errno를 참조하여 적절한 오류 메시지를 생성합니다. 따라서, 코드에서 직접적으로 errno 변수를 사용하지는 않지만, perror 함수가 호출될 때 errno의 값을 기반으로 오류 메시지를 출력합니다.

 

6. 성능 고려사항

파일 시스템 성능: 파일이 저장된 디스크의 성능이 fopen()의 속도에 영향을 미칠 수 있습니다. SSD는 HDD보다 파일 열기 속도가 빠릅니다.
파일 경로: 상대 경로보다 절대 경로를 사용하는 것이 성능에 영향을 줄 수 있습니다. 절대 경로를 사용하면 파일을 찾는 과정이 단순해지기 때문입니다.