반원 블로그

[C 프로그래밍] 파일 입력 함수 본문

2017/C 프로그래밍

[C 프로그래밍] 파일 입력 함수

반원_SemiCircle 2017. 2. 17. 18:00

#1
■파일과 관련된 함수
-열기 : fopen , fopen_s
-닫기 : fclose
-데이터 읽어오기 : fscanf , fscanf_s

※ _s의 사용법은 다음에 다룹시다.

파일 입출력 함수들은 stdio.h에 선언되어있다.
파일 열기에는 2가지 매개 변수가 필요하다.(파일 이름, 파일 모드) 이 중 파일모드는 읽기 용도, 쓰기 용도로 나뉘어진다.

FILE* fopen(const char* filename, const char* mode); 
fopen(파일이름, 파일모드); 


#2
파일 입출력을 하려면 파일 포인터가 존재해야한다. 이 포인터로 대상 파일을 지정한다.
즉 fopen() 반환값을 파일포인터인 fp에 저장하며 실패시에는 NULL이 나온다.


FILE* fp; 
fp = fopen(“data.txt”, “r”); 




#3

데이터를 읽어올 때는 fscanf를 쓴다
scanf(포멧문자열, 값1, 값2, …); 
fscanf(파일포인터, 포멧문자열, 값1, 값2, …); 

키보드로 정수 입력 받기 : scanf(“%d”, &i); 
파일에서 정수 입력 받기 : fscanf(fp, “%d”, &i); 


반환 성공시 변환 성공 개수, 오류 시 EOF를 반환한다.

scanf와 비교하여 공부하면 외우기 쉬울 것 같다.


※fscanf에서 fscanf_s가 나온 이유는 버퍼 오버플로우 문제를 개선하기 위해서 입니다. 따라서 문자열이나 문자를 입력 받을 때는 버퍼의 크기를 전달합니다.


#4
파일 닫기는 fclose를 쓴다. 이후 적용된 파일을 가리키던 파일포인터 fp는 닫혀서 접근이 안된다.

fclose(파일포인터); 



#5
실습 예제
data.txt와 c 프로그램 소스코드

10
5
4
3
2
1
9
8
7
6
5

#include <stdio.h>
#include <stdlib.h>

void main(){
 int n;
 int i;
 File *fp;
 int *data;

 fp = fopen("data.txt","r"); //읽을 파일 이름 data.txt를 읽기 모드(r)로 열겠다. 이를 파일 포인터 fp에 저장
 if(fp!=NULL){ //fp가 NULL인지 검사
    fscanf(fp,"%d",&n); //fscanf로 fp파일 포인터를 통해 data.txt에서 읽기, 처음 숫자인 10을 읽음

    data = (int*)malloc(sizeof(int)*n); //n개의 int 동적 배열로 메모리 할당

    for(i=0;i<n; i++){
       fscanf(fp,"%d",&data[i]); //n 만큼 데이터를 읽어옴
    }
    fclose(fp);//파일 닫기

    for(i=0;i<n;i++){
       printf("data[%d] = %d\n", i , data[i]);
    }

    free(data);//메모리 반환

 }
}



#6 정리
파일 함수  
▶ 파일 열기 함수 : fopen(파일이름, 파일모드);  
 파일 읽기 함수 : fscanf(파일포인터, 포멧문자열, 값1, 값2, …);  
 파일 닫기 함수 : fclose(파일포인터);  
 fopen 함수는 파일포인터를 반환함  
 fopen 함수가 파일 열기에 실패 시에는 NULL을 반환함  
 fscanf, fclose 함수는 fopen에서 반환 받은 파일포인터를 인수로 받음   
 fopen, fscanf, fclose 함수는 stdio.h 에 선언 되어 있음   
 파일 작업을 위해서는 파일을 열고 작업이 완료되면 닫아야 함 



Comments