cat 명령을 C로 구현하는 도중에 질문있습니다.
유닉스 시스템 프로그래밍이라는 책을 보면서 cat 명령어를 만들어보고 있습니다.
-n 옵션에 대한 처리는 이해가 되는데요, -b, -s 옵션을 처리할 때에 빈 줄을 인식하는 부분이 이해하기가 힘듭니다. (-n 옵션은 cat 명령으로 파일 내용을 출력할 때에 줄번호를 붙이는 옵션이며 지금 구현하고자 하는 -b 옵션은 파일 내용을 출력할 때에 비어있는 라인에 대해서는 줄번호를 생략하는 옵션입니다.)
즉,
while((c = getc(fp)) != EOF)
{
...-n 옵션 처리...
if(b_flag == ON && c == '\n')
{
while((c = getc(fp)) == '\n');
putchar('\n');
ungetc(c, fp);
if((c = getc(fp)) == EOF)
break;
printf("\n%d\t", ++count);
}
....-s 옵션처리...
putc(c, stdout);
....
저자의 설명에는 'while((c = getc(fp)) == '\n');'와 관련된 설명이 단순히 '비어있는 라인'이라고만 되어 비어있는 라인은 라인번호를 출력하지 않고 putchar('\n')으로 처리한다고 되어 있습니다.
이미 바로 앞에 있는 줄에서 c의 값이 '\n' 값이라고 판단되어 있는 상태에서 다시 while문을 쓰는 이유는 무엇입니까?
어떻게 'while((c = getc(fp)) == '\n');'이 빈 라인으로 처리되는 것인지 궁금합니다.
[code:1]while((c = getc(fp&#
while((c = getc(fp)) == '\n');
; 로 끝나서 이것 자체로 루프지요. \n 이 아닐때까지 계속 돌겠지요. \n\n\n\n\n\n\n\n\n\n 이라도 출력없이 루프돌다가 \n 이 아닌것이 나오면 루프를 나와서 putchar("\n");https://xenosi.de/
이런것도 좋겠죠?
아래를 참고해 보신다면, 도움이 되실것입니다.
( 저도 예전에 어느분이 링크 걸어주신겁니다. )
http://www.freebsd.org/cgi/cvsweb.cgi/src/bin/cat/
삽질의 대마왕...
제가 잘못 올렸었네요...while()에는 ';'가 없습니다;;;;;
제가 잘못 올렸었네요...
while()에는 ';'가 없습니다;;;;;;;;
누가 해석좀 해주세요~
while((c = getc(fp)) != EOF)
{
...-n 옵션 처리...
if(b_flag == ON && c == '\n')
{
while((c = getc(fp)) == '\n')
putchar('\n');
ungetc(c, fp);
if((c = getc(fp)) == EOF)
break;
printf("\n%d\t", ++count);
}
....-s 옵션처리...
putc(c, stdout);
....
그대로 읽으시면 될 것 같은데요...
while((c = getc(fp)) == '\n') putchar('\n');
파일로 부터 한 글자를 읽어 들여 그게 '\n'이면 '\n'을 출력하고 다음 글자를 읽어 들이는 작업을 반복하다 '\n'이 아닌 글자가 오면 while 문의 조건이 false가 되니까 loop를 빠져나와 다음 아래의 명령을 수행하도록 하는겁니다. 그러니까 1개 이상의 빈줄이 연속으로 나올 경우를 대비해 while loop로 처리하는 것 같네요.
댓글 달기