: 키브도와 모니터를 통한 데이터 입출력이 아니라 외부기억장치(디스크)에 저장되어 있는 파일을 데이터를 입력하거나 출력하는 기능을 의미
- 파일 입력 : 특정 위치에 저장된 파일로부터 데이터를 읽어 메모리 공간으로 가져오는 작업
- 파일 출력 : 메모리에 있는 데이터를 디스크상의 파일에 저장하는 작업
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: 기존 내용 뒤에 덧붙여 씀.
ifw/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 떨어져 있는지를 정수형으로 알려주는 함수.