컴퓨터/프로그래밍

C언어 텍스트 파일 쓰기 방법

2022. 5. 23. 14:55

C언어 텍스트 파일 쓰기 방법

C언어에서 텍스트 파일 쓰기를 위한 간단한 예제입니다. C언어 open()과 fopen() 함수를 이용하여 읽고 쓸 수 있는데요, 우선 텍스트 파일하고 바이너리 파일과의 차이점을 알아야 합니다. 메모장이나 노트패드뿔뿔 같은 텍스트 에디터로 열어서 바로 읽을 수 있는 것은 텍스트 파일이고 꿰껙쿽꺽 이상하게 출력되면 바이너리 파일이라고 이해하시는 분이 있습니다만, 틀린 것은 아니어도 정확한 구분이라고 할 수 없습니다.

텍스트 파일과 바이너리 파일의 차이점

텍스트 파일과 바이너리 파일의 차이점을 쉽게 이해하려면 숫자 255를 어떻게 저장하느냐 방법으로 구별하면 됩니다. 1개 바이트로 표현할 수 있는 최대 숫자는 255입니다. 그럼에도 각 단위의 숫자 각각을 문자 코드 '2'·'5'·'5'로 저장했다면, 즉 0x32·0x35·0x35 3개의 바이트로 저장했다면 텍스트 파일입니다. 이와는 달리 숫자 그대로 0xff로 저장한 파일을 바이너리 파일이라고 합니다.

텍스트 파일 쓰기 방법을 얘기하면서 텍스트 파일과 바이너리 파일의 차이점을 말씀드리는 이유는 fopen()을 써야 텍스트 파일이고 open() 쓰면 바이너리 파일이라고 생각하는 분이 있어서입니다. 다시 말씀드리지만, 텍스트 파일과 바이너리 파일의 차이점은 사용하는 함수 때문이 아니라 저장하는 방법의 차이입니다.

fopen() 함수를 사용해야 텍스트 파일이라고 말씀하시는 분은 아마도 화면에 텍스트를 출력하는 printf() 함수와 유사한 fprintf() 때문이 아닌가 싶습니다. printf()는 치환자 덕분에 서식에 맞추어 변수 값을 조합하여 화면에 텍스트를 출력하기 편합니다. fprintf()도 printf() 만큼이나 텍스트를 출력하기 편합니다.

그러나 사용하는 함수에 따라 텍스트와 바이너리로 구분되는 것이 아니라고 말씀드렸듯이 open() 함수와 write() 함수 조합으로도 텍스트 파일을 작성할 수 있습니다.

C언어 텍스트 파일 쓰기 예제 1

먼저 fopen() 함수와 fprintf()로 텍스트 파일 쓰기한 예제입니다.

#include <stdio.h>

int main( void)
{
   FILE  *fp;
   char  *url = "badayak.com";

   fp = fopen( "badayak.txt", "w");
   fprintf( fp, "badayak url is %s\n", url);
   fclose( fp);

   return 0;
}

텍스트 파일로 쓰기해서 저장했으므로 간단한 쉘 명령으로 파일 내용을 화면에 출력할 수 있습니다.

예제를 test.c로 저장해서 컴파일한 후에 실행하고 생성된 badayak.txt 파일 내용을 출력한 모습입니다.

사족입니다만, "badayak.com" 문자열을 바이너리 파일에 저장했다면 다른 모습일까요? 그렇지 않습니다. 저장하려는 데이터는 "badayak.com"이므로 텍스트 파일로 저장하든 바이너리 파일로 저장하든 파일 내용은 모두 "badayak.com"입니다. 텍스트라고 "badayak.com"이고 바이너리라고 퀙ㄱ7&$3^ 이 아닙니다.

C언어 텍스트 파일 쓰기 예제 2

이번에는 open() 함수와 write() 함수를 사용한 C언어 텍스트 파일 쓰기 예제입니다.

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>  
#include <string.h>

int main( void)
{
   int    fd;
   char  *url = "badayak.com";

   fd = open( "badayak.txt", O_WRONLY ¦ O_CREAT ¦ O_TRUNC, 0644);
   write( fd, url, strlen( url));
   close( fd);

   return 0;
}

실행하면 fopen(), fprintf()를 사용한 예제처럼 텍스트 파일을 쓸 수 있습니다.  O_WRONLY는 쓰기 전용으로 파일을 열고, O_CREAT는 파일이 없을 경우 생성하게 하며, O_TRUNC는 파일이 있을 경우 기존 내용을 삭제하도록 옵션을 주었습니다. 0644는 파일 접근 권한을 8진수로 표현한 것입니다.

실행하면 url 변수의 내용만 저장되었습니다. 만일 fprintf()처럼 변수 값을 조합하여 서식에 맞추어 쓰기하려면 sprintf()를 사용합니다.

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>  
#include <string.h>

int main( void)
{
   int    fd;
   char  *url = "badayak.com";
   char   str[1024];

   fd = open( "badayak.txt", O_WRONLY ¦ O_CREAT ¦ O_TRUNC, 0644);
   memset( str, 0, sizeof( str));
   sprintf( str, "badayak url is %s\n", url);
   write( fd, str, strlen( str));
   close( fd);

   return 0;
}

write() 함수에는 치환자에 의한 서식을 만들 수 없으므로 sprintf()로 문자열을 생성한 후 쓰기한 것입니다.

실행 결과입니다.  메모리를 생성하고 memset()으로 초기화하고 sprintf()를 사용하는 것보다 fprintf()로 한 번에 처리하는 것이 더 편합니다만, write() 함수와 sprintf() 조합도 알아 두면 도움이 됩니다.