# 파일 입출력
- 파일 열기- 입출력 수행하기 - 파일 닫
- 파일 입력: 디스크상의 특정 위치(파일)에 있는 자료를 읽어 기억공간에 수록하는 절차
- 파일 출력: 기억 공간에 있는 자료를 디스크상의 특정 위치에 수록하는 절차.
# 순차파일
만들어진 파일에 자료를 기록하는 함수
출력 : putc(), fputc(), fputs(), fprintf()
입력: getc(), fgetc(), fgets(), fscanf() :: 순차파일의 저장된 자료를 읽어 내는 함수
순차파일 입력함수
파일 출력함수에 의해 만들어진 순차파일의 저장된 자료 읽어내는 함수
자료를 읽을 때는 파일의 끝에 있는 EOF 신호를 만날 때까지 읽을 수 있는 프로그램 작성.
- getc() :문자 단위의 파일 입력함수
- c=getc(fp) // 지정된 파일로부터 한 문자 읽어온다.
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *fp;
char c;
fp=fopen("sample1.dat","r");
if(fp==NULL){
printf("파일을 개방할 수 없습니다!");
exit(1);
}
while((c=getc(fp))!=EOF) // getc()함수에 의해 한 문자씩 읽어와 c에 전달.
putchar(c);
fclose(fp);
}
- fgets() : 파일에 저장된 문자열 자료 읽을 때 사용
- 읽어 낼 문자열 길이 반드시 명시
fgets(문자열 변수, 문자열길이+1, 파일포인터 변수)
ex) fgets(s,40,fp);
C언어에서는 입출력장치를 파일 개념으로 처리
- C언어에서는 자동적으로 3개의 표준파일에 대한 포인터 생성
표준파일 | 파일 포인터 | 대응장치 |
표준입력 | stdin | 키보드 |
표준출력 | stdout | 모니터 |
표준에러 | stderr | 모니 |
- putc(): 문자 단위의 파일 출력함수
put(문자변수, 파일포인터변수);
put(c, fp); //fp가 가리키는 파일에 변수c에 있는 문자 출
- fscanf(): 숫자, 문자 등 복합적인 자료로 구성된 레코드 읽을 때 사용
- 일반적으로 파일의 끝을 판별하는 feof()함수와 같이 사용
형 식 : fscanf(파일포인터 변수, “입력형식”, 변수);
사용 예 : fscanf(fp, “%s %d”, &a, &b);
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *fp;
char c;
fp=fopen("sample1.txt", "w"); //텍스트파일 쓰기모드로 개방
if(fp==NULL){
printf("파일을 개방할 수 없습니다.");
exit(1); //프로그램 끝냄
}
while((c=getchar())!=EOF)
putc(c, fp);
fclose(fp);
}
- fputs(): 문자열을 파일로 출력 fputs(s,fp);
- 지정된 파일에 문자열(하나의 레코드) 출력
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char name[64];
FILE *fp;
if((fp=fopen("sample2.dat","w"))==NULL){ // 파일 쓰기 모드로 개방하고, 에러발생시 메시지 출력
puts("파일을 개방할 수 없습니다!");
exit(1);
}
gets(name);
while(strcmp(name,"end")){
strcat(name,"\n"); //하나의 문자열에 다른 것('\n')추가
fputs(name,fp); //문자열을 fp가 가르키는 파일에 수록
gets(name);
}
fclose(fp);
}
- fprintf(): 지정된 형식을 가지고 파일에 자료 출력
- 여러 항목의 복합적인 자료로 구성된 레코드 저장할 때 유용
- fprintf(파일포인터 변수, “출력형식”, 변수);
fprintf(stdout,"학번 이름 중간 기말 레포트 출석 점수를 입력\n");
// stdout: 모니터를 가리키는 특수한 파일 포인터
[실습] 텍스트 파의 자료 쓰기
#include <stdio.h>
int main(){
FILE *fp; // 파일 포인터 선언
fp = fopen("sample1", "w"); // sample1 파일을 쓰기 모드로 개방
if(fp != NULL){ // 파일 개방 에러 체크
fputs("대한민국 \n", fp); // fputs: 문자열 파일 출력 함수
fputs("서울 \n", fp);
fputs("종로구 \n", fp);
fputs("동숭동 \n", fp);
fputs("169번지 \n", fp);
}
fclose(fp); //파일닫기
}
[실습] 텍스트 파일의 자료 읽기 프로그램
#include <stdio.h>
int main(){
FILE *fp;
char buff[100];
fp = fopen("sample1", "r"); // 읽기모드 개방
if(fp != NULL){
while(!feof(fp)){ //feof: 파일의 끝을 검사하기 위한 함수
fgets(buff, 100, fp); // fgets: 문자열 파일 입력함수
if(feof(fp)) break;
printf(buff);
}
fclose(fp);
}
}
[실습] 파일 입출력 프로그램
#include <stdio.h> //FILE, fputc(), fgets()...
#include <conio.h> //getch()
int main(){
char c;
FILE *fp;
fp=fopen("sample2.txt", "w"); //파일 쓰기모드로 개방
for(c='A'; c<='Z';c++)
fputc(c, fp); //fp가 가리키는 파일에 A~Z 쓰기
getch(); //키보드 눌려질 때까지 대기
fclose(fp);
fp=fopen("sample2.txt", "r"); // 읽기용 개방
while(!feof(fp))
printf("%c", c=fgetc(fp)); //파일 시작부터 끝까지 차례대로 한 문자씩 읽기
fclose(fp);
}
[실습] 파일 만들고 데이터를 입력하는 프로그램
#include <stdio.h> //FILE, fputc(), fgets()...
#include <stdlib.h>
int main(){
FILE *fp;
int ch;
if((fp=fopen("sample3.txt", "w+"))==NULL){ // "w+" 모드로 파일을 열어 쓰기 및 읽기가 가능하도록
printf("***파일을 열 수 없습니다.*** \n");
exit(0);
}
for(ch=65; ch<=92; ch++){
putc(ch, fp);
}
fseek(fp, 8L, SEEK_SET); // 각각의 문자를 찾아 이동. (8문자를 건너 뛰어 가리킴)
// SEEK_SET을 사용하여 파일의 시작부터의 상대 위치로 이동
ch=getc(fp);
printf("9번째 문자는 %c\n", ch);
fseek(fp, 16L, SEEK_SET); //(파일의 시작부터 16문자를 건너 뛰어 가리킴)
ch=getc(fp); //이동한 위치에서 한 문자를 읽어 출력.
printf("17번째 문자는 %c\n", ch);
fclose(fp);
return 0;
}
/*
9번째 문자는 I
17번째 문자는 Q
*/
- 레코드 추가를 위한 사용 모드 (a, a+, ab, ab+)
[실습] 파일에 들어 있는 데이터를 뒤에서부터 읽어 출력하는 프로그램
#include <stdio.h> //FILE, fputc(), fgets()...
#include <stdlib.h>
int main(){
FILE *fp;
int ch;
int str;
if((fp=fopen("sample2.txt", "r"))==NULL){
printf("***파일을 열 수 없다.***");
exit(0);
}
fseek(fp, 1L, SEEK_END); //파일의 끝 바이트
for(ch=0; ch<=26; ch++){
str=getc(fp); //파일에서 한 문자를 읽는다.
fseek(fp, -2L, SEEK_CUR); // 파일 포인터를 현재 위치에서 뒤로 한 문자를 읽고 뒤로 감
putchar(str);
}
fclose(fp);
return 0;
}
[실습] 파일 지우는 함수
#include <stdio.h>
int main(){
FILE *fp;
char filename[20];
puts("파일 삭제 이름?");
gets(filename);
if((remove(filename)==-1)) //remove 파일 지우는 함수
printf("\n삭제를 할 수 없다.");
else
printf("\n삭제되었습니다.");
return 0;
}
# 랜덤파일처리
- 랜덤파일
- 파일의 임의의 위치에서 자료를 읽거나 쓸 수 있다.
- 레코드 길이가 일정
- 순차파일에 비해 기억공간 낭비, but 레코드 검색이 빠르고 효율적이다.
- 일반적으로 랜덤파일을 입출력할 때는 2진모드로 파일을 개방한다. 'wb', 'rb'
- 2진모드
- 텍스트 파일보다 적은 기억공간
- 레코드의 길이를 프로그래머가 결정
- 파일 포인터의 위치 변경 가능
- 랜덤파일 만들기
- fwrite()함수 : 레코드 길이 지정, 자료저장 변수는 포인터형
형 식 : fwrite(저장자료변수, 레코드길이, 레코드개수, 파일포인터);
예시) fwrite(name, 10, 1, fp);
- 랜덤파일 읽기
- fread() : 읽기에 성공하면 읽은 레코드 수 리
형식: fread(읽을 자료변수, 레코드길이, 레코드개수, 파일포인터);
fread (name, 10, 1, fp);
while(1){
if(fread(name,10,1,fp)!=1) //레코드의 개수가 1이므로 1이아닌 값 리턴되면 while 종료
break;
puts(name);
}
- 랜덤파일의 위치 제어
- fseek() 함수 : 파일 포인터를 임의의 위치로 이동시키는 함수
- 랜덤파일의 특정부분을 입출력할 수 있다.
- fseek()함수의 기준위치 지정모드 (stdio.h에 정의됨)
- fseek() 함수 : 파일 포인터를 임의의 위치로 이동시키는 함수
기준위치모드 | 동일기호 | 설명 |
0 | SEEK_SET | 파일의 시작위치 |
1 | SEEK_CUR | 현재 파일포인터의 위치 |
2 | SEEK_END | 파일의 끝 위치 |
형 식 : fseek(파일포인터 변수, 이동할 상대위치, 기준위치를 지정하는 모드);
예시) fseek(fp, 2*REC_size, SEEK_SET);
//기준 위치로부터 앞,뒤로 이동하는 상대위치 개념 사용
반응형
'프로그래밍 > C 프로그래밍' 카테고리의 다른 글
[C언어] 파일 입출력 (0) | 2024.06.06 |
---|---|
[C언어] 메모리 동적 할당 (1) | 2024.06.06 |
[C언어] 구조체와 공용체 (0) | 2024.06.06 |
[C언어] 포인터 및 참조 (0) | 2024.06.05 |
[C언어] 배열 (0) | 2024.06.04 |