콘솔 입출력과 마찬가지로 파일과 프로그램 사이에 입출력에는 스트림이 있고 버퍼가 있다.
fopen 함수는 파일의 이름정보와 스트림의 종류를 전달한다
fopen("파일의이름", "스트림의 종류");
fopen은 연다, 개방한다 등으로 표현하는데
파일을 개방해야지만 읽어오거나 쓸 수 있기 때문이다.
즉, fopen함수는 스트림의 형성을 OS에게 요청 하는 함수이다.
정리하면 fopen 함수는
1. 파일을 개방하는 함수
2. 스트림의 형성을 OS에게 요청하는 함수
fopen 함수가 호출되면 FILE구조체 변수가 생성된다
생성된 FILE 구조체 변수에는 fopen함수로 열린 파일에 대한 정보가 담기고
FILE 구조체 포인터 변수는 가리키는 '지시자'의 역할을 한다
형식 FILE * fp = fopen("data.txt", "wt);
예제1
컴파일되면 data.txt파일이 wt(write text) 즉 출력의 형태로 열린다.
write형일때는 굳이 파일을 직접 생성해주지 않아도 새롭게 생성이되며
만약 디렉토리에 같은 이름의 파일이 이미 있었다면 그 안의 데이터가 전부 덮어씌워진다
즉, w모드는 new라는 의미를 갖고있다
아무튼 FILE구조체 변수에 data.txt파일의 대한 정보가 담기고
FILE 구조체 포인터 변수 fp가 그것을 가리키게 된다
fopen함수가 실행실패 시 널포인터를 반환하므로 if문으로 파일오픈 실패와 -1값을 반환하게 해주고
실패가 되지 않았다면 fputc함수로 한 문자씩 fp로 쓰게된다
왜냐하면, fp라는 구조체 포인터 변수가 data.txt를 가리키고 있기때문에..
fopen함수가 스트림 생성을 요청하는 함수라고 했으므로
스트림의 소멸도 요청해줘야한다.
fclose()라는 함수를 실행한다
인자로는 fp를 넣어 data.txt와 연결된 스트림을 해제하라, 소멸시켜라고 명령한다
fclose함수가 없이 return 키워드에 도달하여 함수가 종료가 돼도 스트림은 다 소멸된다
그러면 왜 fclose함수를 사용하는가? fclose함수는
1. fclose함수는 운영체제가 할당한 자원의 반환(소멸)
2. 버퍼링 되었던 데이터의 출력(fflush함수의 기능)
두가지 기능을한다
그러면 return 키워드가 실행되도 1번과 2번의 기능이 자동으로 실행되지 않는가? 된다
그럼에도 fclose함수를 사용해야하는 이유는
각각의 fopen함수가 사용되는 시점이 다를텐데 프로그램 종료시까지
스트림을 그대로 놔두게되면 자원의 비효율적인 사용과
무엇보다 두번째 이유로
프로그램이 이렇게
start < -----------f1--------f2-----(강제종료됨)-----f3-----------------------------------> end
f1과 f2의 fopen함수를 실행했는데 fclose함수를 안써준 상태로 강제종료가 되버리면
출력버퍼에 남아있던 데이터들이 파일에 저장이 안되고 소멸되버린다
추가로 fflush함수는 나는 파일 스트림을 소멸시키지 않고 출력버퍼만 비울때 쓰인다
출력버퍼를 비운다는것은 앞에서도 말했듯이 출력한다는것이다
fclose함수와 혼동하지말자
기타 함수들 (0) | 2020.10.04 |
---|---|
text모드의 숨겨진 특징 한가지 (0) | 2020.10.04 |
10. 구조체 변수의 typedef 선언 (0) | 2020.10.04 |
9. 구조체란? (0) | 2020.10.04 |
8. 기타 C언어의 여러 함수들 (0) | 2020.10.04 |