본문으로 바로가기
  1. Home
  2. 컴퓨터/프로그래밍
  3. C언어 텍스트 파일 읽기 예제

C언어 텍스트 파일 읽기 예제

· 댓글 0 · 바다야크

C언어 텍스트 파일 읽기 함수

C언어에서 텍스트 파일 읽기에는 fopen() 함수로 파일을 열어서 fgets() 함수를 사용하는 것이 편합니다. open() 함수로 파일을 열어서 read() 함수로 파일을 읽을 수 있지만, 텍스트 파일 읽기는 fopen()와 fgets() 조합이 편한 것은 한 줄씩 읽을 수 있어서입니다.

read() 함수와 fgest() 함수 둘 다 파일 내용을 받을 수 있는 버퍼를 지정하고 버퍼 크기까지 알려 주지만, 차이라면 read() 함수는 버퍼 크기보다 파일 사이즈가 크다면 버퍼 크기만큼 읽어서 버퍼에 저장합니다. 이에 비해 gets()는 버퍼 크기만큼 파일의 내용을 읽되 한 줄의 끝을 만나면 거기까지만 담습니다.

텍스트 파일의 경우 줄 단위로 읽어서 처리하는 경우가 많기 때문에 read()보다 gets()가 더 편합니다. read() 함수를 사용해야 한다면 읽어 들인 내용을 다시 줄 바꿈이 있는지 확인해야 해서 불편합니다.

C언어 텍스트 파일 읽기 예제

// C언어 텍스트 파일 읽기 예제
#include <stdio.h>
#include <stdlib.h>

int main( void)
{
   FILE      *fp;
   char       buf[1024];
                       
   if ( fp = fopen( "./test.c", "r")) {
      fgets( buf, sizeof( buf), fp);
      printf( "%s\n", buf);

      fclose( fp);
   }
   return 0;
}

예제를 test.c로 저장하고 컴파일해서 실행하면 첫 줄인 주석문만 출력됩니다.

C언어 텍스트 파일 읽기
C언어 텍스트 파일 읽기

버퍼 buf의 크기는 1024이고 test.c의 첫 줄 주석문은 1024보다 짧지만, fgets()는 한 줄만 읽어서 반환합니다.

버퍼 크기가 작다면?

만일 한 번에 읽어 들일 문자열보다 버퍼 크기가 작으면 어떻게 될까요? fgets()는 버퍼 크기만큼 파일을 읽다가 한 줄이 끝나지 않으면 버퍼 크기보다 하나 작은 크기만큼 담고, 마지막에는 NULL 값을 넣어서 반환합니다. 이유는 NULL이 없을 경우 문자열의 끝을 알 수 없어서 실행 중 에러가 발생하기 때문입니다. NULL 문자로 문자열 끝을 알 수 없는 변수를 printf()로 출력하면 안 되겠지요.

//1234567890
#include <stdio.h>
#include <stdlib.h>

int main( void)
{
   FILE      *fp;
   char       buf[10];
                       
   if ( fp = fopen( "./test.c", "r")) {
      fgets( buf, sizeof( buf), fp);
      printf( "[%s]\n", buf);

      fclose( fp);
   }
   return 0;
}

주석문을 //123456789로 바꾸고 buf 배열 변수의 크기도 10으로 줄였습니다. 그리고 buf를 printf()로 출력하면 어떻게 될까요?

fgets() 함수 사용 예제
fgets() 함수 사용 예제

고맙게도 fgets()는 버퍼 크기보다 하나 작게 파일을 읽고 마지막 배열 요소에 NULL을 넣어 줍니다. 이렇게 fgets() 함수는 안전한 함수이지만, fgets() 함수를 호출하기 전에 습관적으로 memset() 함수로 초기화해주는 것을 강력히 권합니다.

//1234567890
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main( void)
{
   FILE      *fp;
   char       buf[10];
                       
   if ( fp = fopen( "./test.c", "r")) {
      memset( buf, 0, sizeof(buf));
      fgets( buf, sizeof( buf), fp);
      printf( "[%s]\n", buf);

      fclose( fp);
   }
   return 0;
}
💬 댓글 0

이름을 저장합니다.

최근글 thumbnail 윈도우10 네트워크 공유 폴더 접속이 안 될 때 thumbnail 접이식 샤오미 전기 모기채 추천 (2) thumbnail 충전식 온수 찜질기 전기 핫팩 사용후기 (1) thumbnail 카카오톡 받은 선물 다시 선물하기 thumbnail 윈도우11 기본앱 삭제 프로그램 레보 언인스톨러 (3) thumbnail 보온병 겸용 여행용 전기포트 사용후기 thumbnail C언어 시리얼 통신 브레이크(break) 신호 전송 방법 (2) thumbnail 윈도우11 키보드 반응속도 빠르게
대단하지요? ^^ 💬바다야크 샤오미는 뭐 다만드네요ㅋ 💬인생은꿀맛 기억해 주셔서 고맙습니다.⋯ 💬바다야크 감사합니다. 너무나도 감사합⋯ 💬U@PIA [승인대기] 💬짱구노리