표준 파일 입출력
<파일처리>
* 표준 입출력 함수 사용
: 모든 OS 에서 사용할 수 있는 함수
- ANSI C 에서 제공하는 표준함수임.
* 저수준 입출력 함수 사용
: UNIX / LINUX 에서 제공되는 함수
- 외부 입/출력 장치도 파일로 다룸....
- 파일의 속성을 제어하는 함수도 제공됨.
//*****************
파일 처리 작업 순서
-------------------
1. 파일포인터 또는 파일지시자 변수 선언
(표준입출력) (저수준입출력)
2. 작업 대상 파일을 연다.(open)
: 파일포인터 또는 파일지시자가 대상파일의
주소 또는 정보를 참조하게 됨.
3. 파일안의 내용 입력(read) 또는 출력(write) 처리함
4. 작업이 끝나면 반드시 대상 파일을 닫는다.(close)
//***************
1. 표준 입출력 함수
------------------
fopen() : 파일 열기 함수
원형
FILE * fopen(const char * path, const char *mode);
사용법.
파일포인터 = fopen("열기할 파일명", "열기모드");
원형에서 보면 알 수 있듯이 fopen은 FILE * 이라는 자료형을 반환한다.
int * 처럼 포인터이며 가르키는 것이 int가 아닌 FILE이라는 타입이다.
FILE은 int, double 처럼 이미 정해진 자료형이다.
따라서 해당하는 포인터를 미리 만들어주어야 한다.
FILE *fp;
fp = fopen("test.txt", "w");
또한 매개변수가 char * 이므로 " " 직접 문자열을 넣어주어도 되고,
당연히 문자열 주소를 넘겨주어도 된다. 문자열배을을 만들어서 값을 넣고
해당 배열의 주소를 넣어주어도 된다는 의미이다.
따라서 메인에서 매개변수를 받아 사용도 가능하다.
fp = fopen(argv[1], "w");
주소를 넘겨주어야 한다고 했으며,
argv[1]에는 문자열의 주소가 있으므로 &를 사용하지 않은 것이다.
사실 문자열 관련 되는 변수라면 모두 주소를 가지고 있기 때문에
해당 변수 앞에 &를 붙일 일은 없을 것이다.
입력 값 = 열기 모드 대상 파일 = 열기할 파일
write (쓰기), read (읽기), append (추가쓰기)
"r+a" : 읽기 와 추가쓰기 둘 다 가능
- "wb"/"rb"/"ab" : binary(이진) 모드
fclose() : 파일 닫기 함수
원형
int fclose(FILE *stream);
사용법
fclose(파일포인터);
특별히 다룰만한 내용은 없다.
파일 입출력에서 파일을 열었다면 반드시. fclose를 해줘야 한다는 것 빼고는..
위에서 봤겠지만, fp 라는 파일포인터는 fopen 에서 넘겨받은 내용이 있다.
내가 사용한 파일에 대한 정보가 있으므로 그 정보를 이용해서 닫는 것.
fp는 변수이므로 원하는 대로 만들어서 사용이 가능하다.
fclose(fp);
[fopen(), fgetc(), fputc(), fclose()를 이용한 파일 내용 복사 예제]
우선 파일 포인터 생성. src, des
글자를 옮길 임시 변수 생성. tmp
argc<3 메인의 매개변수 값이 3개 이하이면 프로그램을 종료하라.
use ~ 라고 작성했는데, 원래는 어떻게 실행하는지 방법을 출력하는 부분 입니다.
./프로그램명 원본파일 복사된파일 3개의 아규먼트 필요.
argv[0] : 프로그램 명
argv[1] : 원본파일
argv [2] : 복사된파일
아래 실행 화면을 보시면 이해가 되실 겁니다.
fopen으로 argv[1] 을 읽기 전용으로 열기. (src)
실패시 NULL 반환. NULL 반환 시 아래 if문에서 에러를 출력하고 종료.
동일한 방식으로 argv[2]를 쓰기 전용으로 열기. 없을 시 생성.
src 의 내용에서 한 글자를 tmp에 저장.
tmp를 des에 쓰기.
tmp의 널값이 올 때 까지. 즉 파일의 끝까지 반복.
count로 몇글자 썼는지 체크.
몇 바이트 썼는치 출력하고, 열었던 파일들 닫기.
ps. while문에서 파일의 끝일 때까지 반복인데.. if문에서 왜 또 EOF 인지 확인하는걸까..?
불필요한 점검이 아닌가.. 다시 한번 확인을 해봐야겠네.
** 파일 읽기 / 쓰기 함수 : fgetc(), fputc(),
fgets(), fputs(),
fscanf(), fprintf()
int fgetc(FILE *stream);
문자변수 = fgetc(파일포인터);
int fputc(int c, FILE *stream);
fputc(문자값, 파일포인터);
char * fgets(char *s, int size, FILE *stream);
fgets(읽은값 저장할 문자열변수, 읽을크기, 파일포인터);
int fputs(const char *s, FILE *stream);
=> fputs(문자열값, 파일포인터);
int fscanf(FILE *stream, const char * format,...);
=> fscanf(파일포인터, "입력서식", 값받을 변수주소);
int fprintf(FILE *stream, const char *format, ..);
=> fprintf(파일포인터, "출력포맷 ", 출력값);
fseek(), ftell(), rewind() : 파일포인터 위치 조정 함수들
int fseek(FILE *stream, long offset, int whence);
=> fseek(파일포인터, 이동거리, 기준위치);
(byte, 양수 : 뒤로 이동, 음수 : 앞으로 이동)
int ftell(FILE *stream);
=> ftell(파일포인터);
void rewind(FILE *stream);
=> rewind(파일포인터);
feof() : 파일포인터가 파일 안 내용의 끝인지를 물어보는 함수(file end of file 함수)
int feof(FILE *stream);
=> 정수변수 = feof(파일포인터);
리턴값 : 1(true) - 파일의 끝임. 0(false) - 파일의 끝이 아님.