버퍼 입출력 - 파일에서 한 문자씩 읽기

김신·2023년 1월 13일
0
post-thumbnail

파일 열기

파일에서 데이터를 읽으려면 파일을 열 필요가 있다. 리눅스 시스템콜인 open()함수를 사용할 수도 있지만, 이번에는 파일 포인터를 사용하기 위해 fopen()함수를 사용한다. C 표준 라이브러리인 stdio.h를 통해 fopen()함수를 사용할 수 있다. fopen은 성공 시 유요한 FILE 포인터를 반환한다. 실패하면 NULL(\0)을 반환하고 errno를 적절한 값으로 설정한다.

#include <stdio.h>

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

fopen(path, mode)의 첫번째 인자는 파일의 path를 두번째 인자는 mode를 받는다. 그리고 현 위치에 있는 File이란 이름의 파일을 읽기 모드로 열었다는 것을 알 수 있다.

파일 읽기

파일 포인터로 열린 파일을 읽기 위해 fgetc()함수를 사용할 수 있다. fgetc()는 문자를 하나씩 읽어 나간다. 그 말은 문자 하나를 파일에서 읽었다면 다음으로 fgetc()를 호출하면 그 다움 문자를 읽는다는 뜻이다. 이것은 마치 시스템 콜 read()를 호출 시 읽은 만큼 파일 오프셋이 이동하는 것과 같다. 이 함수는 stream에서 문자를 읽고 unsigned char 타입을 int 타입으로 변환해서 반환한다. 그리고 C언어에서는 운영체제와 상관없이 파일을 끝까지 읽었다면 EOF를 반환한다.

** 파일 포인터를 파일 스트림이라고 부르기도 한다.

#include <stdio.h>

int fgetc(FILE *stream);

한 문자씩 끝까지 읽기

한문자씩 끝까지 읽으려면 fgetc()의 특성을 이용하면 된다. 파일을 끝까지 읽었다면 EOF를 반환하기 때문에 EOF를 반환할 때까지 이 함수를 반복하면 된다. 코드는 다음과 같다.

#include <stdio.h>

int main(){
    
    FILE *stream = fopen("./File", "r");
    if(!stream)
    {
        printf("ERROR: fopen.\n");
        return 1;
    }
    
    int c;
    while((c = fgetc(stream))!= EOF)
    {
        printf("%c", c);
    }
    
    return 0;
}

원하는 만큼 데이터 읽기

원하는 크기만큼 문자열을 읽는 방법은 간단하다. fgetc()함수를 사용하면 된다. 예제 코드는 다음과 같다.

char *s;
int c;

s = str;
while (--n > 0; && (c = fgetc(stream)) != EOF)
	*s++ = c;
*s = '\0';

0개의 댓글