C언어 학습 노트 : 15. 파일 스트림#

1. 스트림(Stream)의 개념#

  • 스트림은 1차원 선형 구조로, 데이터가 빈틈 없이 연속적으로 흐르는 개념이다.
  • 키보드, 파일, 네트워크 소켓 등 입출력 장치는 모두 스트림이라는 공통 인터페이스로 다룰 수 있다.
  • 따라서 비트 스트림이냐 파일 스트림이냐의 차이는 단순히 데이터의 성격 차이일 뿐, 개념적으로는 동일하다.

2. 파일 스트림의 특징#

  • C 표준 라이브러리에서 파일 입출력은 스트림(stream) 을 통해 이루어진다.

  • stdio.h에 정의된 FILE 구조체 포인터(FILE*)로 표현한다.

  • 파일을 다루는 기본 함수:

    • fopen() : 스트림 열기
    • fclose() : 스트림 닫기
    • fread() / fwrite() : 이진 데이터 입출력
    • fprintf() / fscanf() : 형식화된 텍스트 입출력
    • fgets() / fputs() : 문자열 입출력

3. 스트림의 버퍼링#

  • 대부분의 파일 스트림은 내부에 버퍼(buffer) 를 두어 성능을 최적화한다.

  • 버퍼링 방식:

    • 전행 버퍼(full buffering) : 버퍼가 꽉 찼을 때 I/O 발생. (대부분의 파일)
    • 행 버퍼(line buffering) : 개행 문자(\n)가 나오면 I/O 발생. (콘솔 출력)
    • 무버퍼(no buffering) : 즉시 I/O 발생. (stderr)

4. 파일 스트림 모드#

  • fopen() 모드 예시:

    • "r" : 읽기 전용
    • "w" : 쓰기 전용 (기존 내용 삭제)
    • "a" : 추가 모드 (기존 내용 뒤에 이어쓰기)
    • "rb", "wb", "ab" : 바이너리 모드
    • "r+", "w+", "a+" : 읽기/쓰기 혼합 모드

5. 핵심 포인트#

  1. 스트림은 데이터의 연속된 흐름을 추상화한 개념이다.
  2. 파일 입출력은 FILE* 스트림을 통해 이루어진다.
  3. 스트림은 버퍼링을 사용하여 I/O 성능을 최적화한다.
  4. 파일 모드를 적절히 선택하여 텍스트/바이너리, 읽기/쓰기 동작을 제어한다.

6. 실제 적용 예시#

  • 로그 기록: fopen("log.txt", "a"); fprintf(fp, "..."); fclose(fp);
  • 바이너리 데이터 저장: fwrite(buffer, 1, size, fp);
  • 대규모 파일 처리: 버퍼 크기 조정(setvbuf())으로 성능 개선 가능.