Language/C C언어 강좌(형식화 입출력/텍스트 모드, 이진 모드/구조체 입출력/stdout, stdin, stderr 의 파일번호/perror 사용)
  • 728x90
    반응형

     

     

     

    C언어 Chapter 31.


     

     

     

    gets() 함수의 man page 설명

    📌 gets 함수의 정의 형태

     

     

     

     

    🔔 예) while 문의 올바른 사용

     

    🎯 프로그램 수정

    • 위와 같은 while 문은 한눈에 분석하기 까다롭다.
    • 아래와 같이 고쳐 쓸수있다.
    • 한글자만 쓸 경우fputs 보다 fputc 로 대체할 수 있다.

     

     

     

     

    형식화 입출력

    int fscanf(FILE *stream, const char *format [, argument]...);

    int fprintf(FILE *stream, const char *format [, argument]...);

     

    • fscanf() 함수는 오륙 발생하거나 파일의 끝에 도달하면, EOF 를 돌려준다.
    • fprintf() 함수는 오류가 발생하면 음수값을 반환한다.

     

    🔔 예) 키보드로부터 학생 이름과 영어, 수학점수를 입력받아 평균을 구하여, 파일에 기록하고 화면에 출력하는 프로그램.

     

    실행 결과

     

     

     

    텍스트 모드와 이진 모드

    📌 Text Mode and Binary Mode

    • 텍스트 형식과 이진 형식은 숫자를 저장하는 방법의 구분이다.
    • 텍스트 모드에서 '^z'는 파일의 끝을 나타내는 EOF로 번역된다.

     

    • 이진 모드에서 '^z'는 단순히 16진수 1A로 취급된다.

    copy con a.txt    // ctrl +z = ^z

     

     

    [a.txt 생성된 후 파일 내부]

     

    💡 텍스트 모드와 이진 모드는 DOS에서 차이가 난다. 리눅스에서는 별반 차이가 없다.

     

     

    🔔 예) 파일을 이진 모드로 열어서, 한문자씩 읽어 화면에 출력

     

    🎯 프로그램 설명

    fopen(avgv[1], "rb");

     

    • "rb"는 이진 형태로 연다.

    *(string + i++)

     

    • 위 소스는 다음과 같이 수정 할 수 있다.

    1. string[1++];

    2. string[i] = ch;

        i = i + 1;

     

    [파일을 만들어 아래와 같이 타이핑 해둔다.]

     

    실행 결과

     

     

     

    구조체 입출력

    • 구조체 입출력은 레코드 입출력 또는 블록 입출력이라고도 한다.
    • 구조체 입출력에 서는 숫자를 이진 형태로 저장한다.
    • 이진형식 으로 저장하면 숫자를 포함한 구조체가 차지하는 디스크의 공간을 미리 알 수 있는 장점이 있다.
      (데이터베이스 시스템의 하부 저장구조를 만들 때 적합하다.)
    • 기본자료형 뿐만 아니라 배열이나 구조체와 같은 복합 자료형의 데이터를 하나의 명령문으로 저장 할 수 있다.
    • fread()함수와 fwrite() 함수를 사용하면 배열의 모든 원소를 한 번에 저장할 수 있다.
    • 구조체의 경우에도 구조체 전체를 한 번에 저장할 수 있다.

    size_t fread(void *buffer, size_t size_t num, FILE *fp);

    size_t fwrite(void *buffer, size_t size, size_t num, FILE *fp);

     

    • void *buffer : void 포이터인 이유는 구조체의 타입이 동적이기 때문.
    • size_t : 정수형 (unsigned int)
    • size_t size : 개체의 크기 (구조체)
    • size_t num : 개체의 수
    • size_t size x size_t num : 크기 x 개수
    • 읽어들인 개체수를 반환한다.
    • 만약 반환값이 0이면, 아무 개체도 읽어 들이지 않았다는 의미가 된다.
      이 경우는 파일의 끝에 도달했거나 오류가 발생한 경우이며, feof() 함수나 ferror() 함수를 사용해서 오류의 원인을 알 수 있다.

    int feof(FILE *fp);

    int ferror(FILE *fp);

     

    • feof() 함수는 파일의 끝이 아닐 경우 0(거짓)을 반환하고, 파일의 끝일 경우 0이 아닌 값(참)을 반환한다.
    • 이 함수의 사용법은 다음과 같다.

    while (!feof(fp))

    {

        fgetc(fp);

    }

     

    • ferror()함수는 읽기나 쓰기에서 오류가 발생하면 0이 아닌 값(참)을 반환 오류가 없을 경우 0(거짓)을 반환한다.
    • ferror() 함수와 함께 사용하는 함수는 perror() 함수이다.
    • perror() 함수는 시스템 오류에 대한 메시지를 출력한다.

    💡 리눅스는 man 페이지를 참고, 윈도우는 msdn

     

     

    🔔 예) 학생의 이름, 영어와 수학성적을 입력받아 평균을

     

     

    🎯 프로그램 설명

    fflush(stdin);

     

    • 출력을 즉시 실행시킬 때 사용하는 함수이다.

     

    실행 결과

     

     

    🔔 예) perror 의 사용법

     

    🎯 프로그램 설명

    perror("Error: ");

     

    • perror 는 쓰여진 출력문을 출력하고 그후에 에러 메시지를 운영체제가 알아서 출력해준다.

     

    실행 결과

     

     

    🔔 예) stdout 의 이해

     

    🎯 프로그램 설명

    • stdout 의 type 은 FILE 이다.
    • 운영체제에서 stdin, stdout, stderr 의 파일번호를 관리한다. 즉 fclose 함수로 닫을수 있다.

     

    실행 결과

     

     

    🔔 예) stdin, stdout, stderr 파일번호 알아보기

     

    🎯 프로그램 설명

    • stdin, stdout, stderr 세 가지는 운영체제가 파일 번호를 가지고 있다.
    • fp를 만들면 파일번호는 자연적으로 3번을 가진다.

     

    실행 결과

     

     

     

     

    728x90
    반응형
상단으로