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

C언어 - 파일처리 함수(1)

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

파일 입/출력

  • 보조기억장치의 파일을 이용한 자료의 입/출력
    -> *파일처리 함수 이용
  • 키보드나 모니터를 통한 자료의 입/출력
  • -> 표준 입/출력 함수를 이용

파일처리 함수

  • 보조기억장치(디스크)에 들어있는 정보들의 모임을 파일이라고 한다
    -> 파일을 제어하는 함수

파일

  • 보조기억장치에 저장된 데이터들의 모임
  • 일련의 바이트(byte)들로 구성
  • C프로그램은 운영체제를 통해 파일을 읽거나 쓰게된다

** C언어에서는 컴퓨터와 연결된 모든 장치들을 파일의 범주에 넣어서 처리한다

파일의 구분

  • 텍스트 파일(text file)
    -> 화면에 구성되는 문자들로 구성된 파일
  • 2진 파일(binary file)
    -> 텍스트 파일을 포함한 모든 종류의 자료를 다루는 파일
    -> 컴파일이 되어있어 기계어에 가까우므로 내용을 이해하거나 인쇄 불가

파일에 대한 자료의 입/출력

파일 입력
  • 디스크 상의 특정 위치(파일)에 수록되어 있는 자료를 읽어 기억공간에 수록하는 절차
  • 파일 출력
  • 기억공간에 있는 자료를 디스크 상의 특정 위치(파일)에 수록하는 절차

** 파일포인터를 사용하여 파일 입/출력 실행

파일 포인터 - 파일 처리를 위해 사용됨

  • 파일이 어디에 있는지 가리키는 포인터
  • 모든 파일 입/출력 함수는 파일 포인터를 사용

버퍼(buffer) - 파일을 입출력 할 때 사용됨

  • 기억공간과 디스크 사이에 존재하는 임시 기억 공간
  • 파일 입출력 시 디스크에 저장된 자료를 기억공간으로 읽어들이거나,
    기억공간에서 처리된 자료를 디스크에 저장 시 사용

** 컴퓨터의 전자적 장치와 디스크의 물리적 장치가 동작하는 사이에 존재하는 속도 차이를 조절해줌
(잠시 보관해놓았다가 완전히 옮겨졌을 때 버퍼의 내용을 삭제하는)

파일포인터를 이용한 파일 입/출력

자료의 입/출력 개념

  • 프로그램과 입/출력 장치(콘솔, 파일, 소켓 등)사이에 이루어지는 자료의 입/출력
  • 자료의 입/출력을 위한 논리적 통로가 필요함 -> 스트림이라고 부른다

스트림

자료의 입/출력을 위해 스트림 필요

  • 표준 입출력장치를 이용한 자료 입/출력
    -> 표준 입출력장치와의 스트림은 프로그램 실행 시 자동 생성/종료 시 자동 소멸됨
    -> printf() 등의 함수를 사용할 때 스트림이 생성되었다가 출력 후 사라짐

** 파일을 이용한 자료 입출력 시에는 스트림을 프로그램으로 직접 생성과 소멸시켜줘야함

파일 입/출력의 수행 과정

  • 파일 열기 -> 입/출력 수행 -> 파일 닫기
  1. 파일 열기: fopen()함수를 통해 스트림 생성 (파일과 자료를 주고받을 수 있는 통로)
  2. 파일 닫기: fclose()함수를 통해 생성된 스트림 소멸

** 스트림의 생성

  • 파일과 프로그램의 통로(논리적 접속)를 구성
  • 통로 역할을 파일 포인터가 수행한다

파일 입/출력 프로그램 구조

  • 파일 포인터 선언 -> 파일 열기 -> 읽기/쓰기 -> 파일 닫기
  1. 파일 포인터 선언: FILE *fp; - 파일을 가리키는 포인터 변수 선언
  2. 파일 열기: fp = fopen("파일명", "모드"); - 파일을 지정한 모드로 열고 fp가 파일을 가리키게 한다
  3. 읽기/쓰기: 입/출력 수행 - 파일처리함수와 fp를 이용하여 입/출력 수행
  4. 파일 닫기: fclose(fp) - 버퍼를 비우고 fp가 가리키는 파일을 닫는다

** 파일 입출력은 파이썬과 유사하다

파일 입력
#include <stdio.h>

int main(void){
  char ch;
  FILE *fp;
  fp = fopen("sample2.txt","w");

  for(ch='A'; ch<='Z'; ch++){
    fputc(ch, fp);
  }
  fclose(fp);
}
파일처리함수와 기능

파일포인터의 선언

  • 파일 입/출력을 위해 맨 처음 파일포인터를 선언
  • 파일 포인터는 실제 파일과 프로그램을 연결해주는 통로
  • 형식: FILE *변수명;
  • 사용 예: FILE *fp; // 파일형 포인터변수 선언

파일포인터 변수와 버퍼의 관계

FILE *fa, *fb // FILE형: 구조체형 , FILE형 포인터변수: 파일에 대한 정보를 가진 변수

** 파일포인터가 선언되었다는 것은 스트림(통로)이 연결되었다는 뜻이다
-> fopen() 함수에 의해 실제 파일과 연결된다

파일 열기

  • 프로그램과 디스크 상의 파일 사이에 데이터가 입/출력될 수 있도록 통로를 만들어주는 것
  • 형식: fopen("파일명.확장자", "사용모드);
  • 사용 예: fp = fopen("sample.txt", "r")

사용모드(개방모드) = 파일 접근 모드 + 입출력 모드
-> 파일 접근 모드: r, w, a (읽기, 쓰기, 추가)
-> 데이터 입출력 모드: t, b
t : text mode

  • 프로그램에서 파일로 자료를 입출력 시 변환이 일어나는 입출력 모드 (문자 변환 필요 \n <-> CR/LF)

b : binary mode

  • 변환이 일어나지 않는 입출력 모드 (문자 변환 불필요)
fopen() 함수
  • 입/출력이 정상이면 지정된 파일포인터에 시작 주소값을 리턴
  • 파일이 개방되지 않을 때는 에러(NULL)값을 리턴

b가 붙은 것은 binary모드(2진 모드)

w -> 쓰기 모드(텍스트 모드 출력 개방)
rt -> 읽기 모드 (텍스트 모드 입력 개방)

** fopen() 함수 사용 시 파일 open에 실패할 경우를 고려하여 강제 종료를 해준다

if((fp = fopen("파일명.확장자", "사용모드)) == NULL){
    puts("파일을 열 수 없음);
    exit(1); // 프로그램 종료 
}

파일 닫기

  • 형식 : fclose(파일포인터 변수);
  • 사용 예 : fclose(fp);
fclose() 함수
  • 개방된 통로와 버퍼를 원 상태로 환원
  • 쓰기의 경우 파일 끝에 EOF (End Of File)신호를 부가 (완전한 파일로 완성됨을 나타낸다)

파일 : 정보의 집합

  • 파일은 레코드 단위로 구성
레코드
  • 파일 입출력 처리에 사용되는 논리적인 기본 단위
  • 각 레코드들은 필드(field)로 구성
  • 파일 처리함수를 이용하여 파일 편성하는 방법에 따라 순차 파일과 랜덤 파일로 나뉜다
순차 파일(sequential file)
  • 레코드의 길이가 일정하지 않은 파일
  • 파일의 처음부터 차례로 읽고, 기록하는 파일
랜덤 파일(random file)
  • 레코드의 길이가 일정한 파일
  • 파일 임의의 위치에서 자료를 읽고, 기록하는 파일

** 순차파일과 랜덤파일의 자료 처리가 조금 다르다

순차파일에서의 레코드 구성

  • 레코드의 길이가 일정하지 않기 때문에 레코드들의 구분이 필요 (CR/LF를 사용하여 구분)

-> 텍스트 파일의 구분자를 말하는 것 같다 (csv : 쉼표로 구분, \t, \n 등)

순차파일 출력함수

  • 만들어진 파일에 자료를 기록하는 함수
    putc(), fputc(), fputs, fprintf()

순차파일 입력함수

getc(), fgetc(), fgets(), fscanf()

반응형

댓글