본문 바로가기
컴퓨터 공학/C, C++

[ C ] 파일 입출력 이해하기1_스트림 생성, 소멸, 파일 읽는 함수_fopen, fclose, fagets

by hahehohoo 2020. 7. 25.
반응형

스트림 생성, 소멸, 파일 읽는 함수_fopen, fclose, fagets

 

데이터의 이동 경로가 되는 다리를 스트림이라고 했습니다. 기본적인 스트림 개념은 아래 글에서 이미 다루었습니다. 

스트림과 데이터의 이동 

 

■ 스트림 생성 함수

FILE * fopen(const char * filename, const char * mode);

 

위 함수의 첫 번째 인자로는 스트림을 형성할 파일의 이름, 두번째 인자로는 형성할 스트림 종류에 대한 정보를 문자열로 전달합니다. 그러면 이 함수는 해당 파일과의 스트림을 형성하고 스트림 정보를 FILE 구조체 변수에 담아서 그 변수의 주소 값을 반환합니다. 여기서  FILE 구조체의 포인터는 파일을 가리키기 위한 용도로만 사용되었습니다. 그래서 FILE 구조체 변수의 멤버에 직접 접근할 일이 없어서 FILE 구조체가 어떻게 정의되어 있는지 알 필요없습니다.  이제 이 포인터를 이용해 파일에 데이터를 저장하거나 파일에 저장된 데이터를 읽을 수 있습니다.

 

- fopen 함수가 호출되면 FILE 구조체 변수가 생성된다. 

- 생성된 FILE 구조체 변수에는 파일에 대한 정보가 담긴다. 

- FILE 구조체의 포인터는 사실상 파일을 가리키는 '지시자'역할을 한다. 

 

이 정도만 이해하시면 됩니다. 

 

■ 입력 스트림과 출력 스트림의 생성

 

FILE * fpW = fpoen("text.txt", "wt"); // 출력 스트림의 형성
FILE * fpR = fpoen("text.txt", "rt"); // 입력 스트림의 형성

wt는 텍스트 데이터를 쓰기 위한 출력 스트림을 뜻하고,

rt는 텍스트 데이터를 읽기 위한 입력 스트림을 뜻합니다. 

 

이게 개방된 스트림을 통해서 파일에 데이터를 넣을 수 있습니다. fputs 함수를 사용하면 됩니다. 

fputs('A', fpW);

fputs('B', fpW);

fputs('C', fpW);

 

이러면 실행환경에 따라 파일 저장 경로는 다르겠지만 VC++이라면 프로젝트 디렉터리에 text.txt 파일이 생성됩니다. 실제로 그 파일을 찾아서 열어보면 안에 ABC가 저장되어 있습니다. 

 

 

■ 스트림의 소멸을 요청하는 fclose 함수 

 

fclose(fpW);

이렇게 해제할 스트림을 넣으면 됩니다. 

개방했던 스트림을 닫아줘야 하는 이유는 무엇일까요?

 

- 운영체제가 할당한 자원의 반환

- 버퍼링 되었던 데이터의 출력

 

운영체제는 스트림의 형성을 위해서 시스템의 자원(주로 메모리)를 할당합니다. 하지만 파일을 닫지 않으면 자원이 할당된 채로 남아있게 되어, 자원 손실을 초래합니다. 그래서 파일의 사용이 끝나는 즉시 fclose 함수를 호출해서 자원을 반환해주어야 합니다. 또한 파일이 저장되기 전에 컴퓨터를 끄면 데이터가 날라갑니다. 그래서 파일 사용이 끝나면 바로 fclose 함수를 통해 파일을 닫으면 출력 버퍼에 있던 데이터가 파일로 이동하면서 출력 버퍼는 비워집니다. 그럼 컴퓨터 전원이 꺼져도 데이터는 소멸되지 않습니다. 

 

스트림 해제하지 않고 버퍼만 비우고 싶다면 fflush 함수를 사용하면 됩니다. 이 함수 사용법 보러가기

 

■ 파일의 데이터 읽기 fgetc

int ch = fgetc(fpR);

printf("%c \n", ch);

 

받아야하는 데이터가 문자열이라면 위 코드를 그 크기만큼 for문으로 돌리면 됩니다. 

 

 

 

-----------------------------------

C언어 문법 총정리

목록 보러가기 

-----------------------------------

 

 

 

 

반응형


댓글