ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C/C++ gets(3), fgets(3)
    C,C++ & Linux 2020. 5. 22. 02:19
    728x90

    함수 기능

    라인 단위로 파일을 읽어들이는 함수입니다.

     

    gets() 는 표준 입력 파일로부터 개행문자('\n') 를 만날 때까지 읽으며, 개행문자는 널문자로 바꾸어 저장됩니다.

    fgets() 는 지정된 파일로부터 개행문자 포함 최대 n-1 개의 문자를 읽으며 n 번째 문자는 널문자로 채워집니다. 이 때 개행문자는 버퍼에 그대로 남기 때문에 getchar() 같은 함수로 비워내주는것이 좋습니다.

     

    ANSI 표준은 gets() 함수라고 지정되어 있으나 크기 n을 지정할 수 없어서 버퍼 오버플로우가 날 수 있으므로 fgets() 를 쓰는 것이 안전합니다.

     

    함수 원형

    #include <stdio.h>
    
    char *gets(char *buf);
    char *fgets(char *buf, int n, FILE *fp);

     

    매개변수

    buf

    읽은 문자열을 저장할 버퍼, gets()의 경우 오버플로우가 날 수 있으니 주의

     

    n

    읽어들일 수 있는 최대 문자의 갯수

    널문자와 개행문자를 포함한 갯수입니다.

     

    fp

    읽어들일 파일 포인터

     

    반환값

    성공 시 buf 리턴

    파일의 끝에 다다르거나 에러 시 NULL 리턴

    예제

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    int main(int argc, char *argv[]) {
        char buf[BUFSIZ];
    
        // 표준 입력 파일을 끝까지 읽어들임
        // Ctrl + D 를 누르면 표준 입력파일에 EOF 를 넣을 수 있음
        while (fgets(buf, sizeof(buf), stdin) != NULL) {
            // 읽은 문자열을 표준 출력 파일에 출력
            if (fputs(buf, stdout) == EOF) {
                fprintf(stderr, "표준 출력 에러\n");
                exit(1);
            }
        }
    
        if (ferror(stdin)) {
            fprintf(stderr, "표준 입력 에러\n");
            exit(1);
        }
        exit(0);
    }
    

    결과

    예제2

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    int main(int argc, char *argv[]) {
        char command[BUFSIZ];
        char *prompt = "Prompt>>";
    
        while (1) {
    		// 프롬프트 출력
            fputs(prompt, stdout);
    
    		// 명령어 입력
            if (fgets(command, sizeof(command), stdin) == NULL)
                break;
    
    		// 명령어 실행
            system(command);
        }
    
        fprintf(stdout, "Goodbye...\n");
        fflush(stdout);
    
        exit(0);
    }
    

    결과

     

     

     

     

     

     

     

     

    리눅스시스템프로그래밍 저자 : 홍지만
    https://book.naver.com/bookdb/book_detail.nhn?bid=14623672

    책에 기술된 예제 프로그램입니다. 책 내부에는 훨씬 더 많은 자료가 있습니다. (개인적으로 좋았습니다.)

    'C,C++ & Linux' 카테고리의 다른 글

    C/C++ fread(3) fwrite(3)  (1) 2020.05.22
    C/C++ puts(3), fputs(3)  (0) 2020.05.22
    C/C++ putc(3), fputc(3), putchar(3)  (0) 2020.05.22
    C/C++ ungetc(3)  (0) 2020.05.22
    C/C++ ferror(3) feof(3) clearerr(3)  (0) 2020.05.21

    댓글

Designed by Tistory.