더북(TheBook)

TAKEAWAY 8.21 fgetcint 값을 리턴하므로 유효한 모든 문자뿐만 아니라 특수한 오류 상태인 EOF도 인코딩할 수 있다.

또한 EOF가 리턴된 것을 감지하는 것만으로는 파일 스트림의 끝에 도달했다고 판단할 수 없다. feof도 호출해서 스트림의 위치가 EOF 마커에 도달했는지 검사해야 한다.

TAKEAWAY 8.22 읽기에 실패한 뒤에야 파일 끝에 도달했는지 알 수 있다.

예제 8-3은 입력과 출력 함수를 모두 사용하는 예를 보여 준다.

 

예제 8-3 여러 텍스트 파일을 stdout으로 덤프하는 프로그램

 1 #include <stdlib.h>
 2 #include <stdio.h>
 3 #include <errno.h>
 4
 5 enum { buf_max = 32, };
 6
 7 int main(int argc, char* argv[argc+1]) {
 8   int ret = EXIT_FAILURE;
 9   char buffer[buf_max] = { 0 };
10   for (int i = 1; i < argc; ++i) { // 프로세스 인수
11     FILE* instream = fopen(argv[i], "r"); // 파일 이름으로 받음
12     if (instream) {
13       while (fgets(buffer, buf_max, instream)) {
14         fputs(buffer, stdout);
15       }
16       fclose(instream);
17       ret = EXIT_SUCCESS;
18     } else {
19       /* 몇 가지 오류 진단 정보를 제공한다. */
20       fprintf(stderr, "Could not open %s: ", argv[i]);
21       perror(0);
22       errno = 0; // 오류 코드를 리셋한다.
23     }
24   }
25   return ret;
26 }

이 프로그램은 커맨드 라인에서 지정한 파일들을 읽어서 stdout으로 덤프하는 일종의 cat 기능을 간단히 구현한 것이다.Exs 4, Exs 5, Exs 6, Exs 7

 

 


Exs 4 이 프로그램이 정상 실행 코드를 리턴하면서 종료할 때와 오류 코드를 리턴하면서 종료할 때를 설명해 보자.

Exs 5 놀랍게도 이 프로그램은 한 줄을 구성하는 문자 수가 31개를 넘어가는 파일에 대해서도 정상적으로 실행된다. 그 이유는 뭘까?

Exs 6 커맨드 라인 인수를 지정하지 않으면 stdin에서 읽도록 만들어 보자.

Exs 7 첫 번째 커맨드 라인 인수로 "-n"을 지정하여 각 줄 앞에 줄 번호를 출력하도록 만들어 보자.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.