본문 바로가기

IT/WindowsProgramming

윈도우(Windows) 파일 처리함수 - 바이너리(이진) 모드, 텍스트 모드

/* 
written by kaspy (kaspyx@gmail.com)
*/ 



 파일은 프로그램이 사용할 데이터를 하드 디스크에 저장해두는 수단이며, 프로그램은 데이터를 메모리에 올려놓고 처리하지만 전원이 끄면 사라진다. 이 데이터를 보존하기 위해서는 하드디스크나 USB등에 저장해두어야한다. 


* C/C++ 표준 라이브러리에서 제공하는 대표적인 파일 조작 함수


기능

함수(prototype)

설명

열기

FILE *fopen(const char *filename, const char* mode)

신규 혹은 기존 파일 열기

읽기

size_t fread(void *buf, size_t size, size_t count, FILE *fp)

파일에서 지정된 바이트 수만큼 읽기

char * fgets(char *line, int len, FILE *fp)

파일에서 한줄 읽기

int fgetc(FILE *fp)

파일에서 문자 읽기

쓰기

size_t fwrite(void *buf, size_t size, size_t count, FILE *fp)

파일에서 지정된 바이트 수만큼 쓰기

char *fputs(const char *line, FILE *fp)

파일에 쓰기

int fputc(int c, FILE *fp)

파일에 문자 쓰기

닫기

int fclose(FILE *fp)

파일 닫기


파일을 읽고 쓰는 기본적인 순서는 다음과 간다.


(1) 파일을 연다 (open)

(2) 실제로 데이터를 읽고 쓴다(read/write)

(3) 파일을 닫는다 (close)


* 바이너리 모드와 텍스트 모드가 존재


주의해야할 점은 바이너리 모드와 텍스트 모드가 구분된다는 사실이다.


 윈도우(Windows)에서는 개행을 나타낼때는 0x0d(캐리지 리턴,CR)와 0x0a(라인 피드,LF)라고 하는 연속된 2바이트를 사용한다는 사실이다. 그런데 유닉스 계열에서는 개행코드로 0x0a(LF) 만을 사용한다. C/C++ 에서는 개행 문자로 '\n'을 사용하는데 이는 LF에 해당한다.

 그때문에 유닉스 계열에서는 올바른 개행이 되다가 윈도우(Windows) 계열에서는 CR이 없어서 프로그램에 따라 올바르게 출력되지 않는 경우가 생긴다. 이러한 문제때문에 텍스트 모드와 바이너리 모드가 존재한다. fopen 함수로 파일을 열때 읽기에는 'r' 쓰기에는 'w' 문자를 두번째인자로 지정한다. 이떄 'rb', 'wb' 처럼 'b'를 조합하면 바이너리모드 'r','w' 라고 지정하면 텍스트 모드가 된다.

 파일을 텍스트 모드로 열면 파일 내부에 개행 문자('\n')를 넣을때 자동으로 CR+LF로 변환해준다. 또한 반대로 읽을떄에도 CR+LF가 나오면 '\n'으로 변환해준다. 한편 바이너리 모드에서는 이와같은 변환을 하지 않는다. 

 아래는 이진모드와 텍스트모드를 열고 쓰고 닫는 간단한 샘플 코드이다.


  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main()
  5. {
  6.         const char *buf = "Apple\nOrange\nBanana\n";
  7.         FILE *fpBin, *fpTxt;
  8.  
  9.         fpBin = fopen("binary.txt","wb");
  10.         if (fpBin != NULL)
  11.         {
  12.                 fwrite(buf, 1,strlen(buf),fpBin);
  13.                 fclose(fpBin);
  14.         }
  15.  
  16.         fpTxt = fopen("text.txt","w");
  17.         if (fpTxt != NULL)
  18.         {
  19.                 fwrite(buf,1,strlen(buf),fpTxt);
  20.                 fclose(fpTxt);
  21.         }
  22.  
  23.         return 0;
  24. }