C,C++/개념 실습 프로그래밍

[c언어][파일 입출력] 텍스트 파일과 바이너리 파일

luckybee 2023. 1. 18. 14:58
728x90
반응형

1. 바이너리 파일이란?

 

 우리가 많이 사용하는 .jpg 나 .png 같은 그림 파일이나 .mp3와 같은 음악 파일 그리고 .exe와 같은 실행 파일 등이 바이너리 파일에 해당된다. 

 

간단하게 정의한다면 바이너리 파일은 사용자 또는 프로그램이 사용하던 정보나 숫자 값을 특별한 가공 없이 그대로 파일에 저장한다. 

 

ex) 바이너리 파일에 숫자 333을 저장했으면 가공하지 않고 숫자 333이 그대로 바이너리 파일에 저장됨.

 

이렇게 가공이 들어가지 않은 바이너리 파일은 읽거나 쓸 때 파일 구성 형식에 특별한 조건이 없기 때문에 대부분 데이터의 크기로 판단한다. 그래서 파일을 끝까지 읽거나 한 줄 단위로 읽는 명령이 아니라, 10 byte를 읽어라, 100 byte를 읽어라 와 같은 명령을 사용한다. 

 

아래 예시 코드를 보겠다.

int data[10]= {1,2,3,4,5,6,7,8,9}; 
int data2[5]= {0,1,2,3,4};

fwrite(data,sizeof(int)*10,1,p_fp);  //int*배열 갯수의 크기만큼 1번만 p_fp 파일 포인터에 쓰겠다.
fwrite(data,sizeof(int),5,p_fp);     //int 크기만큼 5번 p_fp 파일 포인터에 쓰겠다.

따라서 파일 그대로 저장하는 바이너리 파일은 내용을 확인하려면 해당 파일을 볼 수 있는 프로그램이 별도로 있어야한다.

 

바이너리 파일에 숫자 40 44 48 52 56 이렇게 나열되어 있어도 이미지인지 음성인지 숫자인지 문자열인지 알 수 없기 때문이다.

 

2. 텍스트 파일이란?

 

텍스트 파일은 문자를 기반으로 하는 코드 값이 저장된 파일이다. 즉 문자라는 가공 조건이 하나 추가된 형식의 파일이다.

 

따라서 텍스트 파일을 사용할 때는 문자열 개념을 그대로 사용할 수 있기 때문에 일반적으로 c에서 사용하는 printf 함수나 scanf 함수와 유사한 함수를 사용하게 된다.(fprintf, fscanf) 

 

아래 예시 코드를 보겠다.

 

char a[10]="asd";
char b[10]="qwe"

fprintf(p_fp,"%s\n",a);  // 파일에 asd를 쓰고 줄바꿈을 한다.  
fprintf(p_fp,"%s\n",b);  // 파일에 qwe를 쓰고 줄바꿈을 한다.

 

이렇게 저장된 텍스트 파일은 메모장 같은 프로그램에서 열어볼 수 있다. 또한 텍스트 파일은 문자 기반이기 때문에 굳이 전용 프로그램이 아니더라도 문자열만 확인할 수 있는 프로그램이나 명령을 사용하면 내용을 확인할 수 있다.

 

ex) 명령프롬프트(콘솔 창)

 

3. 바이너리 파일 vs 텍스트 파일

 

문자열은 사람을 위해 존재하는 정보일 뿐 컴퓨터는 바이너리 형태의 정보를 사용한다. 따라서 컴퓨터에서 동작하는 프로그램의 내부 연산은 거의 바이너리 형태로 되어있다. 

 

c언어에서 int 값을 fwrite 함수를 사용하여 저장한다면 4byte 크기로 파일이 저장된다.

 

int a=11;
fwrite(&a,4,1,p_fp);  //4바이트 크기의 int 변수가 4바이트 바이너리 파일로 생성됨

 

이렇게 a값을 텍스트 파일에 저장하려면 이 값을 문자열로 변환해야 한다. 즉 정수 11을 텍스트 파일에 저장하려면 "11"로 변환해야 한다. 그렇기 때문에 바이너리 파일보다 비효율적이다.

int a=11;
fprintf(p_fp,"%d",&a); //문자열 11("11")을 텍스트 파일로 저장

또한 문자열로 저장하게 되면 NULL값을 포함해서 저장되기 때문에 추후에 정수가 긴 1,000,000의 값을 저장한다면, 정수는 4byte의 값만 필요하지만, 텍스트 파일은 8byte의 값이 저장된다. 

 

이러한 문자열 형태로 png파일을 저장한다고 가정했을 때 그림을 구성하는 정수를 모두 문자로 변환 후 NULL값이 추가되기 때문에 저장효율과 속도 전부 바이너리 파일보다 훨씬 떨어진다. 심지어 파일을 읽고 쓸 때 예외도 추가되기 때문에 효율은 극악이라고 볼 수 있다.

 

이러한 단점에도 불구하고 텍스트 파일을 사용하는 이유는 범용성이 매우 높기 때문이다. 예를 들어 바이너리 파일은 특정 프로그램이 없으면 파일을 사용자가 읽을 수 없지만, 텍스트 파일은 전용 프로그램이 없어도 사용자가 읽어서 확인이 가능하다.

 

예를 들어 A컴퓨터에서 B컴퓨터로 데이터로 옮겼을 때 B컴퓨터에 특정 바이너리 파일을 읽을 수 있는 소프트웨어가 없으면 그 바이너리 파일은 B컴퓨터로 할 수 있는 게 없지만, 텍스트 파일은 그러한 걱정 없이 추가 작업을 진행할 수 있다.

 

결과적으로 바이너리 파일은 효율적인 측면에서는 더 좋지만, 범용성은 텍스트 파일이 바이너리 파일보다 월등히 높다.

 

 

728x90
반응형