윤성우저열혈강의 C 프로그래밍개정판 Chapter 24. 파일입출력
Chapter 24-1. 파일과스트림그리고기본적인파일의입출력 윤성우저열혈강의 C 프로그래밍개정판
파일에저장되어있는데이터를읽고싶어요. 콘솔입출력과마찬가지로파일로부터의데이터입출력을위해서는스트림이형성되어야한다. 파일과의스트림형성은데이터입출력의기본이다.
fopen 함수를통핚스트림의형성과 FILE 구조체 fopen 함수호출시생성되는 FILE 구조체변수와이를참조하는 FILE 구조체포인터변수의관계 를이해하자!
fopen 함수호출의결과 스트림을형성할파일의이름형성할스트림의종류 fopen 함수가호출되면 FILE 구조체변수가생성된다. 생성된 FILE 구조체변수에는파일에대한정보가담긴다. FILE 구조체의포인터는사실상파일을가리키는 지시자 의역할을한다. fopen 함수가파일과의스트림형성을요청하는기능의함수이다.
출력스트림의생성 "wt" 에는출력스트림의의미가담겨있다. 출력스트림의형성결과 포인터변수 fp 에저장된값이 data.txt 의스트림에데이터를 전송하는도구가된다.
입력스트림의생성 "rt" 에는입력스트림의의미가담겨있다. 입력스트림의형성결과 포인터변수 fp 에저장된값이 data.txt 의스트림으로부터데이터 를수신하는도구가된다.
파일에데이터를써봅시다. 현재디렉터리에저장된파일 data.txt 를찾는다. 현재디렉터리는실행파일이저장된디렉터리이거나 프로젝트파일이저장된디렉터리이다! 문자 A 를 fp 가가리키는파일에저장해라! FILE * fp = fopen("c:\\project\\data.txt", "wt"); fopen 함수호출시경로를완전히명시할수도있다. 메모장으로파일을열어서확인해본다.
스트림의소멸을요청하는 fclose 함수 fclose 함수호출이동반하는두가지 운영체제가핛당핚자원의반환 버퍼링되었던데이터의출력 fclost 함수가호출되어야스트림형성시할당된모든리소스가소멸이된다. 따라서파일이 오픈된상태로놔두는것은좋지않다.
Ch21 에서호출핚적있는 fflush 함수 콘솔대상으로 fflush 함수를설명한바있다. 대상이파일로바뀌었을뿐달라지는것은없다. 출력버퍼를비운다는것은출력버퍼에저장된데이터를목적지로젂송핚다는의미 입력버퍼를비운다는것은입력버퍼에저장된데이터를소멸시킨다는의미 fflush 함수는출력버퍼를비우는함수이다. fflush 함수는입력버퍼를대상으로호출핛수없다. 이렇듯 fflush 함수의호출을통하여 fclose 함수를호출하지않고도출력버퍼만비울수있다. 그렇다면파일의입력버퍼는어떻게비우는가? 이를위한별도의함수가정의되어있는가?
파일로부터데이터를읽어봅시다. fp 로부터하나의문자를읽어서변수 ch 에저장해라! 이전에문자가써진순서대로읽힌다! 실행결과
Chapter 24-2. 파일의개방모드 윤성우저열혈강의 C 프로그래밍개정판
스트림의구분기준두가지 (Basic) 기준 1 읽기위핚스트림이냐? 쓰기위핚스트림이냐? 파일에데이터를쓰는데사용하는스트림과데이터를읽는데사용하는스트림은구분이된다. 기준 2 텍스트데이터를위핚스트림이냐? 바이너리데이터를위핚스트림이냐? 출력의대상이되는데이터의종류에따라서스트림은두가지로나뉜다.. 텍스트데이터 텍스트데이터읽기스트림 읽기스트림 바이너리데이터 바이너리데이터읽기스트림 쓰기스트림 텍스트데이터바이너리데이터 텍스트데이터쓰기스트림바이너리데이터쓰기스트림 기본적인스트림의구분! 그러나실제로는더세분화!
스트림을구분하는기준 1: Read or Write 스트림의성격은 R/W 를기준으로다음과같이세분화된다. 모드의 + 는읽기, 쓰기가모두가능핚스트림의형성을의미핚다. 모드의 a 는쓰가가가능핚스트림을의미하되여기서말하는쓰기는덧붙여쓰기이다.
스트림을구분하는기준 2: 텍스트모드, 바이너리모드 스트림의성격은데이터의종류에따라서다음과같이두가지로나뉜다. 텍스트모드스트림 (t) : 문자데이터를저장하는스트림 바이너리모드스트림 (b) : 바이너리데이터를저장하는스트림 문자데이터와바이너리데이터 문자데이터 : 사람이인식할수있는유형의문자로이뤄진데이터 - 파일에저장된문자데이터는 Windows의메모장으로열어서문자확인이가능 - 예 : 도서목록, 물품가격, 전화번호, 주민등록번호 바이너리데이터 : 컴퓨터가인식할수있는유형의데이터 - 메모장과같은편집기로는그내용이의미하는바를이해할수없다. - 예 : 음원및영상파일, 그래픽디자인프로그램에의해저장된디자인파일
파일의개방모드조합! r w a r+ w+ a+ Read or Write b t Binary or Text rb 바이너리데이터읽기스트림 wt a+t 텍스트데이터읽기덧붙이기스트림 텍스트데이터쓰기스트림 t 도 b 도붙지않으면텍스트모드로파일개방
텍스트스트림이별도로존재하는이유 1 C 언어는개행을 \n 으로표시하기로약속하였다. 따라서개행정보를저장할때 C 프로그램상에 서우리는 \n 을저장한다.. 개행정보로저장된 \n 은문제가되지않을까? text.txt
텍스트스트림이별도로존재하는이유 2 text.txt 운영체제별로개행을표시하는방법에는차이가있다. 만약 에개행을 \n 으로표현하지않는운영체제가있다면? 개행을 \n으로표현하지않는운영체제는 \n을전혀다르게해석하게된다. 운영체제별개행의표시방법 Windows \r\n Linux \n Mac \r
텍스트스트림이별도로존재하는이유 3 개행정보를정확히저장하기위해서는위와같은종류의변환과정을거쳐야한다. 텍스트모드로데이터를입출력하면이러한형태의변환이운영체제에따라서자동으로이뤄진다.
Chapter 24-3. 파일입출력함수의기본 윤성우저열혈강의 C 프로그래밍개정판
Chapter 21 에서학습핚파일입출력함수들 텍스트데이터입출력함수들 int fputc(int c, FILE * stream); int fgetc(file * stream); // 문자출력 // 문자입력 int fputs(const char * s, FILE * stream); char * fgets(char * s, int n, FILE * stream); // 문자열출력 // 문자열입력 당시에는매개변수 stream 에 stdin 또는 stdout 을인자로전달하여콘솔을대상으로입출력을 진행하였지만, 위의함수들은 FILE 구조체의포인터를인자로전달하여파일을대상으로입출 력을진행할수있는함수들이다.
파일입출력의예 write 순서대로 read 해야한다! 문자 A 와 B 가 fp 가가리키는파일에저장 실행결과 두개의문자열이 fp 가가리키는파일에저장 파일에저장된문자열의끝에는널이존재하지않는다. 때문에파일을대상으로문자열을입출력할때에는개행을의미하는 \n을문자열의마지막에넣어줘야한다. \n을기준으로문자열을구분하기때문이다. \n 을만날때까지 read \n 을만날때까지 read
feof 함수기반의파일복사프로그램 문자단위파일복사프로그램 파일의끝을확인해야하는경우이함수가필요하다. 파 일입력함수는오류가발생하는경우에도 EOF 를반환한 다. 따라서 EOF 의반환원인을확인하려면이함수를호출 해야한다. EOF 가반환이되면... feof 함수호출을통해서 EOF 반환원인을확인!
문자열단위파일복사프로그램 EOF 가반환이되면... 문자단위로복사를진행하느냐문자열단위로 복사를진행하느냐의차이만있을뿐! feof 함수호출을통해서 EOF 반환원인을확인!
바이너리데이터의입출력 : fread int main(void) { int buf[12];.... fread((void*)buf, sizeof(int), 12, fp);.... sizeof(int) 크기의데이터 12 개를 fp 로부터 읽어들여서배열 buf 에저장하라!
바이너리데이터의입출력 : fwrite int main(void) { int buf[7]={1, 2, 3, 4, 5, 6, 7};.... fwrite((void*)buf, sizeof(int), 7, fp);.... sizeof(int) 크기의데이터 7 개를 buf 로부터 읽어서 fp 에저장해라!
바이너리파일복사프로그램 1. 2. 1. 파일의끝에도달해서 buf 를다채우지못한경우에참이된다! 2. feof 함수호출의결과가참이면파일의끝에도달했다는의미이므로마지막으로읽은데이터를파일에저장하고프로그램을종료한다!
Chapter 24-4. 텍스트데이터와바이너리데이터를동시에입출력하기 윤성우저열혈강의 C 프로그래밍개정판
서식에따른데이터입출력 : fprintf, fscanf fprintf 함수를이용하면어떻게텍스트 & 바이너리 데이터를동시에출력할수있을까? fprintf 함수는 printf 함수와그사용방법이매우유사하다. 다만 fp 를대상으로조합이된문자 열이출력 ( 저장 ) 될뿐이다. fscanf 함수를이용하면어떻게텍스트 & 바이너리데 이터를동시에입력할수있을까? sprintf 함수는 printf 함수와그사용방법이매우유사하다. 다만 fp 를대상으로서식문자의조 합형태대로데이터가입력될뿐이다.
fprintf & fscanf 관련예제 저장하는데이터가문자열이므로텍스트모드로개방한다! 실행결과 실행결과
Text/Binary 의집합체인구조체변수입출력 바이너리모드로통째로구조체변수를저장 바이너리모드로통째로구조체변수를복원 구조체변수의입출력은생각보다어렵지않다. fread & fwrite 함수기반으로통째로입출력하면된다. 실행결과
Chapter 24-5. 임의접근을위핚 파일위치지시자 의이동 윤성우저열혈강의 C 프로그래밍개정판
파일위치지시자란? FILE 구조체의멤버중하나. read 모드로오픈된파일위치지시자 : 어디까지읽었더라? 에대핚답 write 모드로오픈된파일위치지시자 : 어디부터이어서쓰더라? 에대핚답 즉, Read/Write에대핚위치정보를갖고있다. 따라서파일입출력과관련이있는 fputs, fread, fwrite 와같은함수가호출될때마다파 일위치지시자의참조위치는변경이된다.
파일위치지시자의이동 : fseek 파일위치지시자의 참조위치를변경시키는함수 fseek 함수의호출결과로인한파일위치지시자의이동결과
fseek 함수의호출의예 1 2 3 4 5 6 7 8 9 e(eof) 1 2 3 4 5 6 7 8 9 e(eof) 1 2 3 4 5 6 7 8 9 e(eof) 1 2 3 4 5 6 7 8 9 e(eof) 1 2 3 4 5 6 7 8 9 e(eof) 1 2 3 4 5 6 7 8 9 e(eof) 실행결과
현재파일위치지시자의위치는?: ftell 현재파일위치자의위치정보를반환하는함수! 맨뒤로이동 현재위치저장 저장해놓은위치복원 실행결과
Chapter 24 가끝났습니다. 질문있으신지요?