본문 바로가기
Computer Science/C 언어

[C언어 18] File Input/Output (파일 입출력)

by rnasterofmysea 2024. 12. 25.
728x90
반응형

 

1. File Streams and FILE Pointers / 파일 스트림과 FILE 포인터

  • 개념: C 언어에서 파일 입출력은 FILE 포인터를 통해 관리됩니다. 파일 스트림은 데이터를 읽고 쓰기 위한 통로로 사용됩니다.
  • 주요 표준 스트림:
    • stdin: 표준 입력 (키보드)
    • stdout: 표준 출력 (콘솔)
    • stderr: 표준 에러 출력 (에러 메시지)

2. Opening and Closing Files / 파일 열기 및 닫기

  • 파일 열기 (fopen):
    • 형식: FILE *fopen(const char *filename, const char *mode);
    • 모드:
      • "r": 읽기 모드
      • "w": 쓰기 모드
      • "a": 추가 모드
      • "rb", "wb", "ab": 바이너리 모드
  • 파일 닫기 (fclose):
    • 형식: int fclose(FILE *stream);
    • 열린 파일 스트림을 닫아 시스템 리소스를 해제합니다.

예제:

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("파일 열기 실패");
        return 1;
    }

    fclose(file);
    return 0;
}

3. Reading and Writing Files / 파일 읽기 및 쓰기

  • 문자 단위 입출력:
    • getc(FILE *stream): 파일에서 한 문자 읽기.
    • putc(int char, FILE *stream): 파일에 한 문자 쓰기.
  • 라인 단위 입출력:
    • fgets(char *str, int n, FILE *stream): 파일에서 한 줄 읽기.
    • fputs(const char *str, FILE *stream): 파일에 한 줄 쓰기.
  • 블록 단위 입출력:
    • fread(void *ptr, size_t size, size_t nmemb, FILE *stream): 데이터를 블록 단위로 읽기.
    • fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream): 데이터를 블록 단위로 쓰기.

예제:

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("파일 열기 실패");
        return 1;
    }

    char ch;
    while ((ch = getc(file)) != EOF) {
        putchar(ch);
    }

    fclose(file);
    return 0;
}

4. Random File Access / 파일의 임의 접근

  • 파일 포인터 이동:
    • fseek(FILE *stream, long offset, int whence):
      • SEEK_SET: 파일의 시작점 기준.
      • SEEK_CUR: 현재 위치 기준.
      • SEEK_END: 파일의 끝 기준.
    • ftell(FILE *stream): 현재 파일 포인터의 위치 반환.
    • rewind(FILE *stream): 파일 포인터를 파일의 시작으로 이동.

예제:

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("파일 열기 실패");
        return 1;
    }

    fseek(file, 10, SEEK_SET); // 파일 시작으로부터 10바이트 이동
    printf("현재 파일 포인터 위치: %ld\\n", ftell(file));

    fclose(file);
    return 0;
}

5. Error Handling in File I/O / 파일 입출력의 에러 처리

  • 에러 확인:
    • ferror(FILE *stream): 스트림에서 에러 발생 여부 확인.
    • feof(FILE *stream): 파일의 끝 도달 여부 확인.
  • 에러 메시지 출력:
    • perror(const char *s): 에러 메시지를 출력.
    • strerror(int errnum): 에러 번호와 관련된 설명 반환.

예제:

#include <stdio.h>

int main() {
    FILE *file = fopen("nonexistent.txt", "r");
    if (file == NULL) {
        perror("파일 열기 실패");
        return 1;
    }

    fclose(file);
    return 0;
}

 


6. 파일 입출력 함수 예제

1. fopen

  • 설명: 파일을 열어 스트림과 연결합니다.
  • 형식: FILE *fopen(const char *filename, const char *mode);

예제:

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("파일 열기 실패");
        return 1;
    }

    printf("파일이 성공적으로 열렸습니다!\n");
    fclose(file);
    return 0;
}

2. fclose

  • 설명: 열린 파일 스트림을 닫습니다.
  • 형식: int fclose(FILE *stream);

예제:

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("파일 열기 실패");
        return 1;
    }

    printf("파일을 닫습니다.\n");
    fclose(file);
    return 0;
}

3. getc

  • 설명: 파일에서 한 문자를 읽습니다.
  • 형식: int getc(FILE *stream);

예제:

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("파일 열기 실패");
        return 1;
    }

    char ch;
    while ((ch = getc(file)) != EOF) {
        putchar(ch); // 파일의 내용을 출력
    }

    fclose(file);
    return 0;
}

4. putc

  • 설명: 파일에 한 문자를 씁니다.
  • 형식: int putc(int char, FILE *stream);

예제:

#include <stdio.h>

int main() {
    FILE *file = fopen("output.txt", "w");
    if (file == NULL) {
        perror("파일 열기 실패");
        return 1;
    }

    putc('A', file); // 파일에 'A'를 씁니다
    putc('B', file); // 파일에 'B'를 씁니다

    fclose(file);
    return 0;
}

5. fgets

  • 설명: 파일에서 한 줄을 읽습니다.
  • 형식: char *fgets(char *str, int n, FILE *stream);

예제:

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("파일 열기 실패");
        return 1;
    }

    char line[100];
    while (fgets(line, sizeof(line), file) != NULL) {
        printf("%s", line); // 파일의 한 줄씩 출력
    }

    fclose(file);
    return 0;
}

6. fputs

  • 설명: 파일에 문자열을 씁니다.
  • 형식: int fputs(const char *str, FILE *stream);

예제:

#include <stdio.h>

int main() {
    FILE *file = fopen("output.txt", "w");
    if (file == NULL) {
        perror("파일 열기 실패");
        return 1;
    }

    fputs("Hello, World!\n", file);
    fputs("This is a test.\n", file);

    fclose(file);
    return 0;
}

7. fread

  • 설명: 파일에서 데이터를 블록 단위로 읽습니다.
  • 형식: size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

예제:

#include <stdio.h>

int main() {
    FILE *file = fopen("example.bin", "rb");
    if (file == NULL) {
        perror("파일 열기 실패");
        return 1;
    }

    int buffer[5];
    fread(buffer, sizeof(int), 5, file);

    for (int i = 0; i < 5; i++) {
        printf("%d ", buffer[i]);
    }

    fclose(file);
    return 0;
}

8. fwrite

  • 설명: 파일에 데이터를 블록 단위로 씁니다.
  • 형식: size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

예제:

#include <stdio.h>

int main() {
    FILE *file = fopen("output.bin", "wb");
    if (file == NULL) {
        perror("파일 열기 실패");
        return 1;
    }

    int data[5] = {1, 2, 3, 4, 5};
    fwrite(data, sizeof(int), 5, file);

    fclose(file);
    return 0;
}

9. fseek

  • 설명: 파일 포인터를 특정 위치로 이동합니다.
  • 형식: int fseek(FILE *stream, long offset, int whence);

예제:

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("파일 열기 실패");
        return 1;
    }

    fseek(file, 10, SEEK_SET); // 파일의 시작으로부터 10바이트 이동
    printf("파일 포인터 이동 완료\n");

    fclose(file);
    return 0;
}

10. ftell

  • 설명: 현재 파일 포인터의 위치를 반환합니다.
  • 형식: long ftell(FILE *stream);

예제:

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("파일 열기 실패");
        return 1;
    }

    fseek(file, 10, SEEK_SET);
    long position = ftell(file);
    printf("현재 파일 포인터 위치: %ld\n", position);

    fclose(file);
    return 0;
}

11. rewind

  • 설명: 파일 포인터를 파일의 시작으로 이동시킵니다.
  • 형식: void rewind(FILE *stream);

예제:

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("파일 열기 실패");
        return 1;
    }

    fseek(file, 10, SEEK_SET); // 파일의 시작으로부터 10바이트 이동
    rewind(file);              // 다시 파일의 시작으로 이동

    printf("파일 포인터가 파일의 시작으로 이동했습니다.\n");
    fclose(file);
    return 0;
}

12. ferror

  • 설명: 파일 스트림에서 에러 발생 여부를 확인합니다.
  • 형식: int ferror(FILE *stream);

예제:

#include <stdio.h>

int main() {
    FILE *file = fopen("nonexistent.txt", "r");
    if (file == NULL) {
        if (ferror(file)) {
            perror("에러 발생");
        }
        return 1;
    }

    fclose(file);
    return 0;
}

💡 도움이 되셨다면 댓글과 공감 부탁드립니다! 😊
📌 더 많은 알고리즘 풀이와 프로그래밍 자료는 블로그에서 확인하세요!
✉️ 문의나 피드백은 댓글이나 이메일로 남겨주세요.

728x90
반응형