본문 바로가기

프로그래밍/C 프로그래밍

[C언어] 파일처리함수

# 파일 입출력

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

 

# 순차파일 

만들어진 파일에 자료를 기록하는 함수
출력 : 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에 정의됨)
기준위치모드 동일기호 설명
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