파일 열기와 닫기
동적할당을 할 때, malloc()함수와 free()함수를 써서 메모리를 확보하고, 해제했는데 파일도 똑같이, fopen()함수로 파일을 열고, fclose()함수로 파일을 닫을 수 있다.
fopen()함수는 보안결함이 있어서 윈도우에선 fopen_s()이라는 대체함수를 사용한다. 반환 값으로 파일 구조체의 주소(포인터)를 반환한다. (에러일 경우엔 NULL을 반환) fopen()함수는 매개변수로, 2개를 받는데, 첫 번째는 열려고 하는 파일의 절대, 상대경로가 저장된 문자열, 두 번째가 ‘접근모드’가 기록된 문자열 2개의 주소다.
여기서 중요한 ‘접근모드‘는 읽기(read)의 “r", 덮어쓰기(write)의 "w", 추가해서 쓰기(append)의 ”a"가 있다. 그리고 이것을 갱신(쓰기)도 할 것(+을 맨 오른쪽에 붙여준다)인지, 텍스트(기본 값)와 바이너리(b를 오른쪽에 붙여준다) 중 어떤 형식으로 저장할 것인지도 꼭 정해줘야 된다. 아니면 이상하게 꼬여서 큰 문제가 발생한다.
fclose()함수는 fopen()후에 꼭 따라붙는 함수로, 파일을 닫는다. (프로그램이 종료되면 자동으로 파일이 닫치긴 하는데, 될 수 있으면 이 함수로 파일을 꼭 닫아줘야 된다.) 매개변수로 닫을 파일의 파일 구조체의 주소를 받고, 반환 값으로 성공했으면 0을, 에러가 발생한 경우에는 EOF를 반환한다.
_fcloseall()함수는 영상에선 자세히 설명 안하지만, 프로그램에서 열어둔 모든 파일을 닫는다. 매개변수는 없고, 반환 값으로 닫은 파일의 개수를 반환한다.
파일 입출력함수
fprintf()함수는 printf()의 파일버전으로, 매개변수로 첫째, 파일 구조체의 포인터를, 둘째, 형식 문자열이 저장된 메모리 주소를, 셋째, 형식 문자열에 대응하는 가변인자(정보가 저장될 기억공간의 주소)를 받고, 그 형식 문자열에 맞추어 파일에 문자열을 출력하는 함수다. 그냥 어려운 말 쓸 것 없이, 매개변수가 파일 구조체 포인터 붙은 것 빼곤 printf랑 형식이 같다.
fscanf()함수는 scanf()의 파일버전, 이번에는 파일로부터 정보를 읽는 함수다. pfrintf()와 마찬가지로, 앞에 파일 구조체의 포인터가 매개변수로 추가된 것 빼곤 scanf()함수랑 똑같다.
fgetc()함수는 getchar()함수를, fputc()함수는 putchar()함수를 파일버전으로 바꾼 것이다. getchar(), putchar()같이 똑같이 문자를 파일에서 출력, 입력하는 함수다.
fgets()함수는 보면 알 수 있듯이 gets()함수의 파일버전이다. 매개변수는 (읽은 문자열이 저장될 버퍼주소, 바이트 크기, 파일 구조체 포인터)와 같다. 문자열을 파일에서 읽어들이는 것은 눈치로 알 수 있을 것이다.
fputs()함수도 파일에 문자열을 출력하는 함수로, 매개변수는 (출력할 문자열이 저장될 기억공간 주소, 파일 구조체 포인터)다. 마찬가지로 대상파일에 값을 출력한다.
추가로 알아둘 점
위의 함수설명대로 프로그램을 짜고 실행하는 예제다. 중복되는 내용인 함수 호출코드는 생략하고, 추가로 알아둘 특이한 경우만 정리했다.
fprintf()에서 출력할 때, 파일을 오픈할 때, fopen()함수로 매개변수를 그냥 ‘이름. 확장자’ 형식이 아니라, CON같이 해주면, 콘솔을 뜻하게 된다. 그래서 화면에 메모장 같은 것이 생겨서 그곳에 fprintf의 출력될 문자열이 출력된다.
그와 같이 fopen()에 매개변수로 FRN를 넣어주면, 프린터로 연결돼서 출력된다.
그리고 다시 한 번, 파일을 배운 상태에서 입출력함수를 보면, getchar함수가 표준 입력 장치(stdin: 키보드)에서 한 글자를 읽어 들이는데, 사실 ‘표준입력 장치파일’이 맞는 표현이다. 그래서 사실 getchar로 파일 입력을 할 수 있다.
fflush()는 입출력 정보를 지워버리는 함수였는데, 대놓고 FILE *(파일 포인터)가 매개변수로 들어갔었다. 예전에, 이것의 “FILE *stream“부분은 좀 나중에 배운다 했는데, 그 내용이 위의 내용이다.(fflush()는 윈도우에서만 작동하는 것도 다시 알아두자)
바이너리(binary) 입출력
바이너리(binary)입출력은 파일을 메모리로 보고 입출력 하는 것이다.
여기서 나오는 함수는, fread(), fwrite()함수 인데, 간단하다. A.mp3파일에 unsigned char[10] (사진
에서는 짤려졌다)을 해서
그 값을 fread로 10만큼을 옮긴 후에, (I/0포인터로)
fwrite로 다시 10만큼 다른 파일에 쓰기하면 되는 것이다. 이것을 파일 끝까지
반복하면 파일의 copy(카피)가 된다. 그때 여기서 카피되는 정보의 위치를 강제로 바꾸려면, fseek()함수를 사용하고, 위치를 찾을 때는 ftell()함수를 사용하면 된다.