프로그래밍 언어/C
C언어) 파일처리함수(2)
nomfang
2021. 4. 3. 00:46
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 는 파일 포인터의 현재 위치
반응형