본문 바로가기
프로그래밍/Linux Programming

표준 파일 입출력

by K_Coder 2011. 10. 6.


<파일처리>
 * 표준 입출력 함수 사용
 : 모든 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) - 파일의 끝이 아님.