2012. 7. 13. 16:01

#include <stdio.h>
#include <unistd.h>   /* getopt 함수를 정의하는 헤더 파일 */

main(int argc, char *argv[])
{
   int opt;
   /* 명령라인의 l, f, a, i, 옵션을 처리 : 는 인수가 필요하면 사용*/
   while ((opt = getopt(argc, argv, "lf:ai")) != -1) {
      switch(opt) {
         /* l, a, i 옵션이면 옵션을 출력 */
         case 'l':
         case 'a':
         case 'i':
            printf("option : %c\n", opt);
            break;
         /* f 옵션이면 옵션과 인수를 출력 */
         case 'f':
            printf("option %c's argument : %s\n", opt, optarg);
            break;
         /* 인식되지 않는 옵션 출력 */
         default:
            printf("unknown option : %c\n", optopt);
      }
   }
   exit(0);
}

[kweun001@localhost ]# a.out -l -f test.c -ai

---------------------------------------------------------------------------------

라인 번호출력 프로그램

#include <stdio.h>
#include <unistd.h>   /* getopt 함수를 정의하는 헤더 파일 */

void output_file(FILE *fp);

int flag=0;

main(int argc, char *argv[])
{
   FILE *fp;
   int opt;

   if (argc == 1) {   /* 명령라인에서 입력을 잘못하면 */
      printf("Usage : a.out [-n] filename ...\n");
      exit(1);
   }

   /* 명령라인의 n 옵션을 처리 */
   while((opt = getopt(argc, argv, "n")) != -1) {
      switch(opt) {
         /* n 옵션이면 flag에 1을 저장 */
         case 'n':
            flag = 1;
            break;
         /* 인식되지 않는 옵션이면 오류 메시지 출력 */
         default:
            printf("unknown option : %c\n", optopt);
      }
   }
  
   /* 명령라인 인수가 2가 아니라는 것은 -n 옵션이 있다는 의미이므로 파일이름을
      얻기 위해 argv를 1 증가 */
   if(argc != 2)
      argv++;

   /* 여러 개의 파일을 처리할 수 있도록 반복 */
   while (*++argv) {
      printf("\n[filename : %s]\n", *argv);
      if((fp = fopen(*argv, "r")) == NULL) {
         perror("fopen failed");
         exit(2);
      }
      output_file(fp);
      fclose(fp);
   }
   exit(0);
}

void output_file(FILE *fp)
{
   int ch, line=1;

   /* flag가 1이면 라인 번호 1 출력 */
   if(flag)
      printf("1   ");
   /* 파일 내용을 화면으로 출력 */
   while((ch=getc(fp)) != EOF) {
      putc(ch, stdout);
      /* flag가 1이고 ch가 '\n'이면 라인 번호 출력 */
      if(flag && ch=='\n')
         printf("%-4d", ++line);
   }
}

---------------------------------------------------------------

개선된 프로그램

#include <stdio.h>
#include <unistd.h>   /* getopt 함수를 정의하는 헤더 파일 */

void output_file(FILE *fp);

int flag=0;

main(int argc, char *argv[])
{
   FILE *fp;
   int opt;

   if (argc == 1) {   /* 명령라인에서 입력을 잘못하면 */
      printf("Usage : a.out [-n] filename ...\n");
      exit(1);
   }

   /* 명령라인의 n 옵션을 처리 */
   while((opt = getopt(argc, argv, "n")) != -1) {
      switch(opt) {
         /* n 옵션이면 flag에 1을 저장 */
         case 'n':
            flag = 1;
            break;
         /* 인식되지 않는 옵션이면 오류 메시지 출력 */
         default:
            printf("unknown option : %c\n", optopt);
      }
   }
  
   /* 명령라인 인수가 2가 아니라는 것은 -n 옵션이 있다는 의미이므로 파일이름을
      얻기 위해 argv를 1 증가 */
   if(argc != 2)
      argv++;

   /* 여러 개의 파일을 처리할 수 있도록 반복 */
   while (*++argv) {
      printf("\n[filename : %s]\n", *argv);
      if((fp = fopen(*argv, "r")) == NULL) {
         perror("fopen failed");
         exit(2);
      }
      output_file(fp);
      fclose(fp);
   }
   exit(0);
}

void output_file(FILE *fp)
{
   int ch, line=1;

   if(flag)
      printf("1   ");
   while((ch=getc(fp)) != EOF) {
      if(flag && ch=='\n') {
         /* 다음 문자가 EOF면 출력하지 않고 빠져 나옴 */
         if((ch=getc(fp)) == EOF)
            break;
         /* ch를 fp 파일로 되돌림 */
         ungetc(ch, fp);
         printf("\n%-4d", ++line);
      } else
         putc(ch, stdout);
   }
   printf("\n");
}

Posted by 몰라욧