파일과 스트림 그리고 기본적인 파일의 입출력
파일에 저장되어 있는 데이터를 참조하길 원한다고 가정한다면 구현한 프로그램과 참조할 데이터가 저장되어 있는 파일 사이에 데이터가 이동할수 있는 다리를 놓는 일. 그 데이터 이동의 경로가 되는 다리를 가리켜 '스트림(stream)'이라 한다.
fopen함수 호출을 통한 파일과의 스트림 형성과 FILE 구조체
스트림을 형성할 때는 호출하는 함수. 굳이 알 필요는 없다.
입력 스트림과 출력 스트림의 생성
스트림은 한 방향으로 흐르는 데이터의 흐름을 의미한다. 스트림은 데이터를 파일로부터 읽어 들이기 위한 입력 스트림과 데이터를 파일에 쓰기 위한 출력 스트림으로 구분된다. 스트림 형성을 위한 fopen 함수의 호출방법은 두 가지가 인자로 전달되어야 한다.
첫 번째 전달인자 스트림을 형성할 파일의 이름
두 번째 전달인자 형성하고자 하는 스트림의 종류
ex) FILE * fp = fopen("data.txt", "wt"); //출력 스트림의 형성
"파일 data.txt와 스트림을 형성하되 wt모드로 스트림을 형성해라!" -> wt모드의 스트림은 텍스트 데이터를 쓰기 위한 출력 스트림을 뜻한다.
위의 스트림은 출력 스트림이기 때문에 파일에 데이터를 쓸 수는 있어도 읽지는 못한다. 만일 파일로부터 데이터를 읽기 원한다면 입력 스트림을 형성해야 한다.
FILE * fp = fopen("data.txt", "rt"); //입력 스트림 형성
"파일 data.txt와 스트림을 형성하되 rt모드로 스트림을 형성하라!" -> rt모드의 스트림은 텍스트 데이터를 읽기 위한 입력 스트림을 뜻한다.
fopen함수의 호출을 통해서 파일과의 스트림이 형성되었을 때 파일이 오픈되었다라고 표현하는 것이 일반적이다.
파일에 데이터를 써보자.
FirstFileWrite.c
해당 파일이 생성되는데 실행방법에 따라, 실행환경 및 설정에 따라서 파일이 생성되는 위치는 달라진다. 그래서 경로를 포함해서 이름을 지정해도 된다.
ex) FILE * fp = fopen("C:\\Project\\data.txt", "wt");
이런식으로, 경로도 설정할 수 있다. 여튼 이렇게 스트림이 형성되면, fp는 파일 data.txt를 지칭하는 포인터가 된다.
fputc('A', fp);
fp가 지칭하는 파일 data.txt에 문자 A가 저장되고 B 등등이 저장된다. fclose함수가 호출되면 데이터는 저장이 되고, data.txt와 연결되었던 출력 스트림은 소멸된다. 저장된 data파일을 찾아 실행 해보자.
스트림의 소멸을 요청하는 fclose 함수
fclose 함수의 호출을 통해서 개방되었던 파일을 닫아줘야 하는 이유는,
운영체제가 할당한 자원의 반환
버퍼링 되었던 데이터의 출력
함수 호출을 통해 스트림의 형성을 요청하는 것은 프로그래머지만 실제로 스트림을 형성하는 주체는 운영체제이다. 그리고 스트림의 형성을 위해서 시스템의 자원(메모리 등)을 할당한다. 이 자원은 파일을 닫아주지 않으면 할당된 채로 남아있게 되어, 그만큼의 자원손실을 초래, 파일의 사용이 끝나는 즉시 자원을 반환해줘야 한다.
fflush함수
출력버퍼를 비운다는 것은 출력버퍼에 저장된 데이터를 목적지로 전송한다는 의미
입력버퍼를 비운다는 것은 입력버퍼에 저장된 데이터를 소멸시킨다는 의미
fflush 함수는 출력버퍼를 비우는 함수. fflush 함수는 입력버퍼를 대상으로 호출할 수 없다.
파일대상의 입력버퍼를 비워야한 하는 상황이라는 것이 특별히 존재하지 않는다.
파일로 부터 데이터를 읽기.
FirstFileRead
파일의 개방 모드
스트림을 구분하는 기준1 : 읽기 위한 스트림..쓰기 위한 스트림 앞서 언급했기 때문에 넘어가도록 하겠다.
개행은 환경마다 다 틀리다.
MS-DOS의 파일 내 개행 \r\n
Mac의 파일 내 개행 \r
UNIX \n
스트림을 구분하는 기준 : 텍스트 모드, 바이너리 모드
파일 입출력 함수의 기본
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); //문자열 입력
fprintf(fp, "123");
fprintf(fp, "567"); 123567이 출력되는데 출력이 되는 순서위치를 기억하고 있다.
123567..EOF
feof함수 기반의 파일복사 프로그램
feof(fp) 파일 끝이 아니면 0이 반환
파일 끝이면 0이 아닌 값을 반환
'c언어' 카테고리의 다른 글
20140429 - 텍스트 데이터와 바이너리 데이터를 동시에 입출력 (0) | 2014.04.29 |
---|---|
20140428 - 인자값을 이용해 파일복사, 바이너리 데이터의 입출력, 문제풀기 (0) | 2014.04.28 |
20140424 - 파일과 스트림, 그리고 기본적인 파일의 입출력 (0) | 2014.04.24 |
20140423 - 파일 입출력 고수준(fprintf, fscanf) 저수준 함수(read, write) (0) | 2014.04.24 |
20140423 - 열거형(Enumerated Type)의 정의와 의미 (0) | 2014.04.23 |