728x90
입력 스트림과 출력 스트림의 형성을 요청하는 fopen 함수

#include <stdio.h>
FILE * fopen(const char * filename, const char * mode);

fopen함수를 통해 FILE 구조체 변수가 생성, 파일과의 스트림 형성
FILE 구조체 변수에 파일 정보가 담김 (파일 데이터가 담기는 것이 아님)

FILE * fp = fopen("data.txt", "wt");  // wt(write in text mode)모드로 파일 data.txt와 출력스트림을 형성
FILE * fp = fopen("C:\\Project\\data.txt", "wt");    // 경로 지정시 \ 자체를 표현하려면 \\ 두개 써야함

FILE * fp = fopen("data.txt", "rt");    // rt모드는 입력스트림을 형성

fputc('A', fp); // fp가 지칭하는 파일 data.txt에 문자 A 저장



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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 함수를 호출해주는 것이 좋다.

출력 버퍼를 비우는 fflush 함수

앞에서 stdout을 대상으로 호출했듯이 출력버퍼를 대상으로 호출한다. (wt모드)

입력버퍼를 비우려면 데이터를 읽으면 된다. 따라서 입력버퍼를 비우는 함수는 따로 존재하지 않는다.




파일 입출력 예제 (파일을 생성해서 문자와 문자열 저장후 읽어들이기)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#include <stdio.h> int main(void) { FILE * fp=fopen("simple.txt", "wt"); if(fp==NULL) { puts("파일오픈 실패!"); return -1; } fputc('A', fp); fputc('B', fp); fputs("My name is Hong \n", fp); fputs("Your name is Yoon \n", fp); fclose(fp); return 0; }

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

+ Recent posts