title: “C언어 파일 입출력 3 이진 파일” categories:

  • C

    #C언어 파일 입출력 3 이진 파일 : 네이버 블로그

파일 포스팅 첫 설명처럼 텍스트 파일은 사람이 읽을 수 있으나 이진 파일은 읽을 수 없다

그리고 텍스트 파일은 줄바꿈이 있고 이진 파일은 줄바꿈이 없다.

이진 파일을 사용하면 scanf()의 변환과정 없이 바로 숫자 데이터를 읽을 수 있기 때문에 과정이 빠르고 저장 공간도 적게 든다.

그러나 텍스트 파일은 기종이 달라도 아스키 코드로 저장되므로 호환이 되지만 이진 파일은 정수나 실수를 표헌하는 방법이 시스템마다 다를 수 있기 때문에 호환 문제가 있을 수 있다.

이진 파일 열기

이진 파일도 텍스트 파일 과정처럼 파일 모드를 바꿀 수 있다

FILE=*fp;

fp=fopen(“binary.bin”,”wb”);

binary.bin 파일을 쓰기이진파일모드(“wb”)로 연다

모드는 아래 표로 정리하였다

   
“rb” 읽기 모드 + 이진 파일 모드
“wb” 쓰기 모드 + 이진 파일 모드
“ab” 추가 모드 + 이진 파일 모드
“rb+” 일고 쓰기 모드 + 이진 파일 모드
“wb+” 쓰고 읽기 모드 + 이진 파일 모드
  • 모드는 fflush(),fsetpos(), fseek(), rewind() 같은 함수를 이용해 변환이 가능하다.

이진 파일 입출력

이진 파일은 값을 읽는 fread(), 값을 쓰는 fwrite()가 있다

int buffer[SIZE]

fwrite(buffer,sizeof(int),SIZE,fp) buffer가 가리키는 위치에서 SIZE만큼 데이터를 읽어서 이진 파일에 저장한다

fread(buffer,sizeof(int),SIZE,fp) 이진 파일에 저장된 데이터를 SIZE만큼 읽고 buffer 에 저장한다

아래 예제를 보자

#include
int main() {
 FILE \*fp = NULL;
 if ((fp = fopen("student.dat", "wb")) == NULL) { //wb모드로 파일 열기
 fprintf(stderr, "출력을 위한 파일을 열 수 없습니다\n");
 exit(1);
 }
 int a[3] = {3,4,6};
 fwrite(a, sizeof(int), 3, fp); //이진 파일 쓰기
 fclose(fp);

 if ((fp = fopen("student.dat", "rb")) == NULL) { //rb모드로 파일 열기
 fprintf(stderr, "출력을 위한 파일을 열 수 없습니다\n"); 
 exit(1);
 }
 int b[3];
 fread(b, sizeof(int), 3, fp); //이진 파일 읽기
 for (int i = 0; i < 3; i++)
 {
 printf("%d\n",b[i]); //b[i] 출력
 }
 fclose(fp);
}

이진 파일은 줄바꿈이 없으므로 메모리 주소 쓰듯이 위치에 대해서 생각해 볼 필요가 있다고 생각한다

이것으로 이진 파일 입출력에 대한 포스팅을 마친다

업데이트: