ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • fscanf(), fwrite(), fread()
    Visual Studio/C 기초 2012. 11. 4. 15:25

    fscanf()

    fscanf()는 입력 동작이 stdin 대신에 지정된 스트림을 통해서 수행되기 때문에 scanf()와 거의 동일하지만 약간 다릅니다.

    fscanf(FILE *fp, *fmt ...);

    아까도 말씀드렸듯이 scanf에선 stdin에서 입력동작이 수행되는 반면 fscanf는 위의  *fp에서 수행됩니다. 포인터 fmt는 fscanf()가 입력을 받아들이는 방법을 지정하는 형식화 문자열에 대한 포인터 입니다. 예제를 보겠습니다.

     

    #include <stdio.h>
    #include <stdlib.h>

    main(){
     float f1, f2, f3, f4, f5;
     char buf[80];
     FILE *fp;
     puts("읽기모드로 파일을 불러옵니다. 파일명을 입력해주세요.");
     gets(buf);
     if((fp=fopen(buf,"r")) == NULL){
      fprintf(stderr, "파일을 여는데 실패했습니다!");
      exit(1);
     }
     fscanf(fp, "%f %f %f %f %f", &f1, &f2, &f3, &f4, &f5);
     printf("값은 각각 %f, %f, %f, %f %f 입니다.\n",f1,f2,f3,f4,f5);
     fclose(fp);

    그냥 scanf 는 스트림이 stdin으로 고정적이기 때문에 사용자가 직접 입력하는 함수이지만 fscanf는 스트림을 fp로 지정함으로써 파일 내의 내용을 읽어들이는 함수입니다.

     

    fwrite(), fread()

    fwrite()는 메모리의 데이터를 블록 단위로 바이너리 모드의 파일에 기록합니다.

    fwrite(void *buf, int size, int count, FILE *fp);

    buf는 파일에 기록할 데이터가 저장되어 있는 메모리 영역에 대한 포인터입니다. void형이기 때문에 어떤 데이터형에 대한 포인터든지 될 수 있습니다.

    size는 개별적인 데이터 항목의 크기를 바이트 단위로 지정합니다.

    count는 기록할 항목의 수를 지정합니다. 예를 들어 100개의 요소를 가지는 정수형 배열을 지정하기 원한다면 각각의 int형은 2바이트를 차지하고 있으므로 size는 2가 됩니다. count값은 100이 됩니다. 만약 size값을 모를경우 sizeof()를 사용해도 됩니다.

    fread()는 바이너리 모드의 파일에서 블록 단위의 데이터를 메모리로 읽어들입니다.

    fread(void *buf, int size, int count, FILE *fp);

    fwrite()와 구조는 같습니다. 여기서 fp는 fopen()으로 파일을 열 때 돌려주는 FILE형에 대한 포인터입니다. 두 개를 사용한 프로그램의 예제입니다.

     

    #include <stdio.h>
    #include <stdlib.h>

    #define SIZE 20

    main(){
     int count, arr1[SIZE], arr2[SIZE];
     FILE *fp;
     char filename[SIZE];
     
     for(count=0; count<SIZE; count++)
      arr1[count]=2*count;

     puts("바이너리 쓰기모드로 파일을 열기 위해 파일명을 입력해주세요.");
     gets(filename);

     if((fp=fopen(filename,"wb")) == NULL){
      fprintf(stderr,"파일을 여는 데 실패했습니다!\n");
      exit(1);
     }
     if(fwrite(arr1,sizeof(int),SIZE,fp) != SIZE)
     {
      fprintf(stderr,"파일을 쓰는 데 실패했습니다!\n");
      exit(1);
     }

     fclose(fp);

     if((fp=fopen(filename,"rb")) == NULL){
      fprintf(stderr,"파일을 여는 데 실패했습니다!\n");
      exit(1);
     }

     if(fread(arr2,sizeof(int),SIZE,fp) != SIZE)
     {
      fprintf(stderr,"파일을 읽어들이는데 실패했습니다!\n");
      exit(1);
     }
     fclose(fp);

     for(count=0; count<SIZE; count++)            // fwrite를 사용했을 때와 fread를 사용했을 때의 배열 arr1, arr2값이 같다는 것을 보여주기 위한 출력입니다.
      printf("%d\t%d\n", arr1[count],arr2[count]);
    }
      

    여기서 설명을 안드린 부분이 있는데, fwrite(arr1,sizeof(int),SIZE,fp) != SIZE 를 사용한 부분입니다.

    이 구문은 함수가 돌려주는 값이 count보다 작다면 어떤 에러가 발생했다는 것을 알려주기 위한 구문입니다.

     

     

    'Visual Studio > C 기초' 카테고리의 다른 글

    fseek()  (0) 2012.11.05
    ftell(), rewind()  (0) 2012.11.04
    fprintf()  (0) 2012.10.22
    fopen()  (0) 2012.10.16
    C언어 프로그램 출력에 대해  (0) 2012.09.23

    댓글

Designed by Tistory.