FILE * fopen(const char * filename, const char * mode);
FILE 구조체 변수에 파일 정보가 담김 (파일 데이터가 담기는 것이 아님)
#include <stdio.h>
int main()
{
FILE * fp = fopen("data.txt", "wt");
if (fp == NULL)
{
puts("File open failed");
return -1;
}
fputc('A', fp); // 출력의 대상을 파일로 지정.
fputs("BC", fp);
fclose(fp);
return 0;
}
|
스트림의 소멸을 요청하는 fclose 함수
#include <stdio.h>
int fclose(FILE * stream);
fclose 함수가 가지는 의미 (써야하는 이유)
- OS는 스트림 형성을 위해 시스템의 자원(주로 메모리)을 할당한다. 이 때 fclose함수를 통해 자원을 반환해준다.
- 두번째로 fclose 함수를 통해 버퍼에 있던 데이터가 출력이 되게 된다. 출력버퍼에 데이터가 존재하는 상황에서 비정상 종료가 될 때 소멸될 수 있는 문제도 있을 수 있다. 이 때문에 버퍼의 데이터가 파일로 바로 저장되도록 fclose 함수를 호출해주는 것이 좋다.
파일 입출력 예제 (파일을 생성해서 문자와 문자열 저장후 읽어들이기)
|
13행에서 \n을 넣지않으면 읽기를 했을 때 문자가 생길 수 있다. 문자열이 파일에 저장할 때는 null문자가 저장되지 않고, 때문에 파일에서는 개행을 기준으로 문자열을 구분하기 때문이다.
#include <stdio.h>
int main(void)
{
char str[30];
int ch;
FILE * fp=fopen("simple.txt", "rt");
if(fp==NULL) {
puts("파일오픈 실패!");
return -1;
}
ch=fgetc(fp);
printf("%c \n", ch);
ch=fgetc(fp);
printf("%c \n", ch);
fgets(str, sizeof(str), fp);
printf("%s", str);
fgets(str, sizeof(str), fp);
printf("%s", str);
fclose(fp);
return 0;
}
|
읽어 들일 때는 write순서대로 read해야 저장된 값대로 읽어지는 것을 볼 수 있다. (저장된 값의 순서대로 fputc는 fgetc로 fputs는 fgets로 읽는다.)
feof 함수
#include <stdio.h>
int feof (FILE * stream);
파일의 끝(End Of File)에 도달한 경우 0이 아닌 값 반환 (읽어들일 데이터가 더 이상 없음을 의미)
파일 입력함수는 오류가 발생했을 때에도 EOF를 반환한다. 아래의 문자와 문자열 단위 파일복사 프로그램에서
파일에 끝에 도달한건지, 오류가 발생한건지 체크를 할 수 있다.
#include <stdio.h>
int main(void)
{
FILE * src = fopen("src.txt", "rt"); // 미리 만들어진 src.txt 파일을 text mode로 읽음
FILE * des = fopen("dst.txt", "wt"); // src.txt의 text를 dst.txt파일에 text mode로 씀
int ch;
if (src == NULL || des == NULL)
{
puts("파일 열기 실패!");
return -1; // -1은 오류를 의미
}
while ((ch=fgetc(src)) != EOF)
{
fputc(ch, des);
}
if (feof(src) != 0)
puts("파일 복사완료!"); // 0이 아닌 값을 반환하면 EOF에 도달했음을 의미
else
puts("파일 복사실패..");
fclose(src);
fclose(des);
return 0;
}
|
정상적으로 파일이 복사되면 파일 복사완료! 메시지와 함께 src.txt파일의 text가 dst.txt파일에 복사된 것을 볼 수 있다.
'Study > C' 카테고리의 다른 글
선행처리기와 매크로 (0) | 2016.08.29 |
---|---|
파일위치 지시자 / 메모리 관리와 동적할당 (0) | 2016.08.28 |
구조체 공부 (0) | 2016.08.23 |
c언어 복습 - 문자와 문자열 관련 함수 (0) | 2016.08.22 |
c 복습-문제풀이2 (0) | 2016.08.22 |