본문 바로가기
프로그래밍 언어/C

C언어) 파일처리함수(2)

by nomfang 2021. 4. 3.
728x90
반응형

순차파일 출력함수

  • 순차파일 : 레코드의 길이가 일정하지 않은 파일
  • 출력 : 만들어진 파일에 자료를 기록(저장)
    putc() fputc() - c 가 붙은 문자 단위
    fputs() - s 가 붙은 문자열
    fprintf() - 파일의 f가 붙은 printf문

getc() fgetc() fgets() fscanf() -> 순차파일 입력함수 (저장된 자료를 읽는다)

putc()

  • 문자 단위의 파일 출력 함수
  • fputc()와 유사함
  • 형식 : putc(문자변수, 파일포인터변수);
    파일 포인터가 가리키는 파일 내에 있는 문자변수의 문자를 출력
#inculde <stdio.h>
#include <stdlib.h>
void main(){
    FIlE *fp; // 파일 포인터 선언
    char c;
    fp = fopen("sample1.dat","w"); // 파일을 쓰기 모드로 개방
    if(fp == NULL){ // 파일 개방 에러 체크
    printf("파일 개방 실패");
    exit(1);
    }

    while((c = getchar()) != EOF) // 문자 출력의 끝 판별
        putc(c,fp); // 문자를 파일로 출력
    fclose(fp);
}

fputs()

  • 문자열을 파일로 출력(저장)할 떄 사용
  • 형식 : fputs(문자변수, 파일포인터변수)
  • 지정된 파일의 하나의 문자열(레코드)을 출력
#inculde <stdio.h>
#include <stdlib.h>
#inclued <string.h>


void main(){
    FIlE *fp; // 파일 포인터 선언
    if((fp = fopen("sample.dat","w"))==NULL){
        puts("파일 개방 실패");
        exit(1)
    }
    gets(name);
    while(strcmp(name, "end")){ 
        strcat(name, "\n");
        fputs(name, fp);
        gets(name);
    }
    fclose(fp);
}

fprintf()함수

  • 지정된 형식을 가지고 파일에 자료 저장(출력)
  • 여러 항목의 복합적인 자료로 구성된 레코드를 저장할 때 유용
  • 형식 : fprintf(파일포인터 변수, "출력형식", 변수);
  • 예 : fprintf(fp, "%s %d\m" , a, b);
  • 파일포인터 변수가 가리키는 곳에 지정된 형식대로 자료를 출력(저장)
fprintf(stdout, "모니터에 출력할 내용\n");
 // stdout은 모니터를 가리키는 특수 파일 포인터

fprintf(파일포인터, %5s %3d, name, age);

c언어에서는 입출력 장치를 파일 개념으로 처리한다

  • 자동적으로 3개의 표준 파일에 대한 포인터를 생성
    -> 표준 파일에 대해서는 따로 파일 포인터 선언을 할 필요 없음
    stdin : 키보드 - 표준 입력
    stdount : 모니터 - 표준 출력
    stderr : 모니터 - 표준 에러

순차파일 입력함수

  • 파일 출력함수에 의해 만들어진 순차파일의 저장된 자료를 읽어내는 함수
  • 자료를 읽을 때 파일 끝의 EOF 신호를 만날 때 까지 읽어오도록 프로그램 작성

getc() fgetc() fgets() gscanf()

getc() 함수

  • 문자 단위의 파일 입력함수
  • fgetc()와 유사함
  • 사용 예 : c = getc(파일포인터변수);
  • 지정된 파일로부터 한 문자를 읽어온다
#inculde <stdio.h>
#include <stdlib.h>
#inclued <string.h>


void main(){
    FIlE *fp; // 파일 포인터 선언
    char c;

    (fp = fopen("sample.dat","w");
    if(fp==NULL{
        printf("파일 개방 실패");
        exit(1)
    }
    while((c=getc(fp)) != EOF)
        putchar(c)
    fclose(fp);
}

gets()

  • 파일에 저장된 문자열 자료를 읽어옴
  • 읽을 문자열의 길이를 명시해야함
  • 형식 : fgets(문자열변수, 문자열 길이 + 1, 파일 포인터 변수);
  • #include <stdio.h> #include <stdlib.h> void main(){ char name[20]; FILE *fp; if((fp = fopen("sample2.dat", "r"))==NULL{ puts("파일 개방 실패"); exit(1); } while((fgets(name, 20, fp)!= NULL)) printf("%s", name); fclose(fp); }

fscanf()

  • 숫자, 문자 등 복합적인 자료로 구성된 레코드를 읽을 때 사용
  • 일반적으로 파일의 끝을 판별하는 feof()함수와 같이 사용
  • 형식 : fscanf(파일포인터 변수, "입력형식", 변수);
  • while(!feof(fp)){ fscanf(fp, "%5s, %3d, name, &age); }

레코드 추가 모드

a a+ ab ab+

  • 기존에 파일이 있으면 기존 파일에 추가하고, 없으면 새로 만든다

랜덤 파일 처리

  • 레코드의 길이가 일정
  • 파일의 임의의 위치에서 자료를 읽거나 쓸 수 있다
  • 순차 파일에 비해 기억공간 닝비가 크지만 빠르고 검색이 효율적
  • 일반적으로 2진모드로 입출력을 개방한다 ( wb, rb)
2진 모드의 특징
  • 텍스트 파일보다 적은 기억공간 차지
  • 레코드의 길이를 프로그래머가 결정
  • 파일 포인터의 위치 변경 가능

랜덤파일 입출력 함수

출력함수

fwrite()

  • 형식 : fwrite(저장자료변수, 레코드길이, 레코드개수, 파일포인터);
  • 사용 예 : fwrite(name, 10, 1, fp);
  • 자료 저장 변수는 포인터 형 변수로
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(){
    FILE *fp;
    char name[10];

    if((fp=fopen("sample.dat", "wb")) == NULL)
    puts("파일 개방 실패");
    eixt(1);
       }
    gets(name);
    while(strcmp(name, "END")){ // END를 만나면 종료
        fwrite(name, 10, 1, fp); // 2진파일 쓰기
        gets(name);
    }
    fclose(fp);
}

fread()

  • 형식 : fread(읽을 자료변수, 레코드길이, 레코드 개수, 파일포인터);
  • 사용 예 fread(name, 10, 1, fp);
  • 읽기에 성공하면 읽은 레코드 수가 리턴된다
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(){
    FILE *fp;
    char name[10];

    if((fp=fopen("sample.dat", "wb")) == NULL)
    puts("파일 개방 실패");
    eixt(1);
    }

    while(1){ 
        if(fread(name, 10, 1, fp)!= 1) // 레코드의 개수를 1로 설정했기 때문에 1이 아닌 값이 리턴되면 종료
            break
        pets(name);
    }
    fclose(fp);
}

랜덤파일의 위치 제어

fseek()

  • 파일 포인터를 임의의 위치로 이동시키는 함수
  • 랜덤 파일의 특정 부분을 입출력 할 수 있다
  • 형식 : fseek(파일포인터 변수, 이동할 상대 위치, 기준위치 지정 모드);
  • fseek(fp, 2*REC, SEEK_SET)
  • 기준위치로부터 앞, 뒤로 이동하는 상대 위치 개념을 사용한다
  • 기준위치 지정모드 : stdio.h 에 정의됨

  • SEEk_CUR 는 파일 포인터의 현재 위치
반응형

댓글