C언어 파일 처리 함수

김지원·2023년 3월 5일

C언어(독학사)

목록 보기
7/7

파일 입출력

파일 입출력이란

: 키브도와 모니터를 통한 데이터 입출력이 아니라 외부기억장치(디스크)에 저장되어 있는 파일을 데이터를 입력하거나 출력하는 기능을 의미

  • 파일 입력 : 특정 위치에 저장된 파일로부터 데이터를 읽어 메모리 공간으로 가져오는 작업
  • 파일 출력 : 메모리에 있는 데이터를 디스크상의 파일에 저장하는 작업

1) 스트림(stream)

  • c에 입출력이 수행되는 모든 데이터들의 흐름은 byte단위로 이루어진다.
    입력과 출력이란 것은 프로그램과 하드웨어장치 사이를 데이터들이 오고가는 것을 의미하는데 이러한 논리적인 통로를 스트림이라고 한다.

2) 표준입출력 스트림(stream) 종류

  • 프로그래머가 별도로 생성하지 않아도 자동으로 생성되는 스트림 : 표준입출력 스트림(standard input output stream)
    stdin(표준 입력 스트림) : 키보드로부터 데이터를 입력받기 위한 입력 스트림
    stdout(표준 출력 스트림) : 모니터(터미널)로 데이터를 출력하기 위한 스트림 / 에러가 없는 출력
    stderr(표준 에러 스트림) : 모니터(터미널)로 데이터를 출력하기 위한 스트림 / 에러가 있는 출력

파일 종류

  • 프로그램 작성 시 키보드로부터 입력받은 데이터와 모니터로 출력한 결과는 프로그램 종료 혹은 전원이 꺼지면 메모리에서 삭제됨으로 영구적으로 사용할 수 없다.
    데이터의 영구적 보관이 필요할 때 파일을 생성시켜 보관한다.

1) 순차 파일
: 파일의 처음부터 시작해서 데이터를 차례로 읽거나 기록하는 파일.

  • 랜덤 파일에 비해 기억공간은 절약되지만 데이터 검색 시 순차적으로 검색하므로 검색시간이 오래 걸린다.

2) 랜덤 파일
: 파일의 임의 위치에서 데이터를 읽거나 기록할 수 있는 파일

  • 데이터 저장되어 있거나 기록할 수 있는 위치로 바로 이동이 가능하므로 검색시간은 빠르지만 자료가 랜덤하게 저장되어 있다보니 메모리의 효용성이 떨어진다.

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

파일 입출력의 수행과정

  • 디스크에 저장되어 있는 파일에 데이터 입출력하기 위해서는 기본적으로 파일을 열어서 데이터를 읽거나 쓰는 작업을 수행한 후 열려진 파일을 닫는다.
  • 파일을 대상으로 하는 작업은 파일 포인터에 의해 이루어지므로 먼저 파일 포인터 변수를 선언해야한다.
파일 파일 포인터 이름;
FILE *f_p;

1) 파일 열기 fopen()
: 파일 입출력을 위한 파일 여는 함수

  • 파일 Open을 먼저 요청하지 않으면 해당 파일을 참조할 수 없다.
파일 포인터명 open함수 파일명 파일모드
f_p = fopen (memo.txt, "r");
↑ 파일의 시작주소를 갖는 파일 포인터
	  ↑ fopen() : 파일 포인터에 해당 파일의 시작주소값을 리턴해 주는 함수
      파일이 제대로 열리지 않을 떄는 NULL 값을 리턴.
      		            ↑ 모드 : 파일을 통해 처리하고자 하는 작업 종류에 따라 권한 지정.

w : 기존 내용 삭제 후 파일을 씀.
a : 기존 내용 뒤에 덧붙여 씀.
if w/a 모드로 파일을 오픈했을 떄 파일이 없다면 열고자 하는 파일명을 가진 새로운 파일을 자동으로 생성해주지만
r 모드로 파일을 오픈했을 때 파일이 없다면 null 값을 반환한다.

  • r / w / a : 오픈 파일이 텍스트 파일임을 의미 / ASCII 문자로 구성된 원시 프로그램 파일 문자변환 필요.
  • rb / wb / ab : 오픈 파일 형태가 이진 파일임을 의미 / 원시 프로그램을 컴파일 하여 만들어져 문잔변환 불필요.

2) 파일 닫기 fclose()
: 작업이 완료된 파일을 닫는 함수

close 함수 (파일 포인터명)
fclose (fp);
↑ open되었던 file stream과 사용한 입출력 버퍼를 반납한다.
		↑ open된 파일의 시작주소를 가리키고 있는 포인터 변수

3) 입출력 수행 함수
: 파일을 입출력을 수행하기 위한 함수

4) feof() 함수
: 파일에 읽을 내용이 남아 있으면 0을 반환하고 읽을 내용이 없다면 0이외의 정수를 반환한다.

  • 파일의 끝까지 읽어 들어야 할 떄 파일의 끝에 도달했는지 확인이 필요할 때 사용.

순차 파일 처리

  • 레코드(: 파일 입출력 시 사용되는 논리적인 기본 단위)의 길이가 일정하지 않을 때 주로 사용한다.
  • 레코드의 길이가 일정하지 않으면 레코드의 끝을 알려주기 위한 구분기호가 필요하다. CR/LF (Carreage Return / Line Feed) 을 사용하는데 "\n" 문자를 CR/LF 로 바꾸어 처리하게 된다.

순차 파일 생성

1) fputc()
: 한 문자, 즉 한 byte씩 파일에 기록하기 위한 함수

  • 파일 포인트가 가르키는 대상 파일에 전달된 한 문자를 기록한다.
문자출력함수 문자/정수 파일포인트명;
fputc('A', fp);

2) fputs()
: 문자열을 파일 포인터가 가르키는 대상 파일에 저장하는 함수.

  • 문자열 끝에 존재하는 NULL 문자 (\0)은 기록되지 않는다.
문자출력함수 문자열 파일포인트명;
fputs("String", fp);

3) fprintf()
: 출력 작업을 할 때 서식화 형식 기능을 지원하는 함수.

  • 정수, 문자, 실수 등 복합적인 자료형으로 구성된 레코드 저장 시 유용하게 사용가능하다.

순차 파일 읽기

: 디스크에 저장되어 있는 순차 파일의 내용을 읽어 내는 함수.

  • 파일 끝에 있는 EOF 를 만나면 파일 읽기를 종료한다.

1) fgetc()
: 파일로부터 한 문자(1 byte)씩 읽어 오는 함수.

  • 파일 포인터가 가르키는 대상 파일에서 한 byte를 읽은 다음 int형으로 반환하고 오류가 발생하거나 끝을 만나면 EOF 값을 반환한다.
문자입력함수 파일포인트명
fgetc(fp);

2) fgets()
: 파일로부터 문자열 단위로 읽어 오는 함수.

  • fgets() 파일 포인터 fp가 가르키는 파일을 대상으로 문자열의 최대 길이(n)만큼 읽어온 문자열을 문자열 저장주소가 가르키는 메모리 공간에 읽어 들인다.
  • 단, 읽는 중간 줄바꿈 문자(\n)을 만나거나 파일의 끝에 도달하면 수행을 멈춘다.
  • 읽어들인 문자열 배열 str의 끝에는 NULL 문자(\0)이 자동으로 추가된다.
  • 잘 읽어들였으면 해당 문자열이 저장된 공간에 대한 주소를 반환하고, 그렇지 않은 경우 NULL을 반환한다.
문자열입력함수 문자열저장주소 문자열의최대길이 파일 \포인트명
fgets( str, n, fp );

3) fscanf()
: 복합적인 자료로 구성된 파일을 읽을 때 유용한 함수

  • 파일 읽기에 실패하거나 파일의 끝에 도달하면 EOF 반환한다.

순차 파일 레코드 추가

: a(append mode) 로 파일을 열고 값을 입력한다.
w(write mode) 로 지정한 경우는 기본 파일에 내용을 지우고 덮어쓰지만 append mode 는 기존 내용 뒤에 이어서 입력하게 되므로 추가 기능을 구현하게 된다.


랜덤 파일 처리

  • 레코드의 길이가 일정하기 떄문에 구분할 필요가 없으므로 CR/LF"\n" 의 변환작업이 필요 없어 이진 모드가 사용된다.
  • 프로그래머는 레코드의 길이를 미리 알고 있고 모든 레코드의 길이가 일정한 점을 이용해 입출력을 수행한다.

랜덤 파일 생성

: fwrite() 함수를 이용해 데이터를 블록 단위로 기록한다.

  • 블록은 byte단위로 이루어진 데이터의 집합을 의미하는데 일정한 크기를 가진 블록 단위의 데이터를 한번에 기록하기 용이하다.
함수 데이터시작주소 데이터크기 데이터개수 파일포인트명
fwrite( &str, sizeof(int), 3, fp );

랜덤 파일 읽기

: fread() 함수를 이용해 읽는다.

  • 마지막까지 읽기에 성공하면 읽은 레코드 수를 리턴하고 실패하면 읽어야 하는 수보다 적은 수를 리턴한다.
함수 데이터시작주소 데이터크기 데이터개수 파일포인트명
fread( &str, sizeof(int), 3, fp );

랜덤 파일 위치 제어

: 랜덤 파일은 파일의 임이의 위치에서 시작할 수 있음으로 포인터의 위치를 옮기기 위한 함수가 필요하다.

1) fseek()
: 위치를 가르키는 포인터를 임의의 위치로 이동시키는 함수. 특정한 위치의 데이터 입출력을 가능하게 한다.

  • offset 을 통해 현재위치를 기준으로 앞이나 뒤로 이동하는 상대위치 개념.
이동함수 파일포인터 이동거리(offset) 기준위치모드
fseek( fp, 0, 0/1/2 );

2) ftell()
: 파일의 시작위치를 기준으로 현재 포인터가 가리키는 곳이 몇 byte 떨어져 있는지를 정수형으로 알려주는 함수.

0개의 댓글