열렬히.뛰기

스트림과 파일 입출력

Language > 프로그래밍 언어 > C > 스트림과 파일 입출력

스트림

입/출력을 표현하는 데이터의 흐름. 바이트 단위로 생각한다.

  • 장치가 무엇이건 입/출력은 연속된 바이트의 스트림. (장치 독립성)
  • 입력 장치 → 버퍼 → cpu → 버퍼 → 출력 장치
  • 이 과정을 통해 속도를 높일 수 있다.

표준 입출력 스트림

  • stdin : 표준 입력 스트림
  • stdout : 표준 출력 스트림
  • stderr : 표준 오류 스트림

입출력 함수의 분류

스트림과 입출력 형식이 지정되었는지에 따라 분류 가능.

표준 스트림

  • getchar(), putchar(), gets_s(), puts()

일반 스트림

  • fgets(), fputs(), fprintf(), fscanf()

printf()와 scanf()

c
printf("10.3f", 1.122355);
// 10 : 필드폭. 출력 칸수 지정
// .3 : 소수 자릿수

scanf("%3d", &a) 
// 3 : 필드폭을 의미하며 몇 칸씩 읽을지 확인

파일 입출력

파일

  • 파일을 활용해 입출력을 할 수 있다.
  • 파일 역시 스트림으로 취급. 연속된 바이트로 취급한다.

파일의 종류는 다음과 같다.

  1. 텍스트 파일 - 사람이 읽을 수 있는 파일
  2. 이진 파일 - 컴퓨터가 읽을 수 잇는 파일

파일처리

파일을 열어보자.

c
FILE *fp;
fp = fopen("test.txt", "w");
fclose(fp);

remove("sample.txt") // 성공 시 0, 실패 시 -1 반환

함수 fopen은 다음과 같은 매개변수를 가진다.

  1. 파일 이름 : 위의 “test.txt”
  2. 파일 모드
    • r : 읽기 모드
    • w : 쓰기모드. 기존 내용이 지우진다.
    • a : 추가모드. 데이터가 끝에 추가 됨

이진 파일은 파일모드에 알파벳 b를 붙여서 연다.

텍스트 파일 읽기/쓰기

쓰기에 사용되는 함수

c
// 텍스트 쓰기
fgetc();
fgets();

// 기타 타입 쓰기
fscanf();

읽기에 사용되는 함수

c
// 텍스트 읽기
fputc();
fputs();

// 기타 타입 읽기
fprintf();

이진 파일 읽기/쓰기

c
fwrite(buffer, sizeof(int), SIZE, fp)
fread(buffer, sizeof(int), SIZE, fp)

/*
buffer : 메모리 블록의 크기
sizeof(int) : 항목의 크기
SIZE : 항목의 갯수
fp : file 포인터
*/

버퍼링

c
// 버퍼를 비워야 하는 경우
fflush(fp);

// 버퍼를 제거해야 하는 경우
setbuf(fp, NULL);

임의 접근

파일의 어느 위치에서든지 읽기/쓰기가 가능하게 만드는 방법

파일 포인터를 이동시켜서 데이터를 읽거나 쓴다.

c
// 위치 표시자 제어함수
fseek(fp, offset, origin)

/*
fp : 파일 포인터
offset : 기준 위치로부터 위치 표시자가 이동하는 거리
origin : 위치 표시자를 이동시키는 기준 위치
SEEK_SET -> 파일의 시작
SEEK_CUR -> 현재 위치
SEEK_END -> 파일의 끝
*/


// 위치 표시자의 현재위치
ftell(fp)

// 파일의 끝을 알아내는 함수
foef()