본문 바로가기
쿤즈 Dev/C

[C언어] 파일 (File) 다루는 함수 사용 방법

by Koonz:) 2021. 3. 24.
728x90

프로그래밍을 하면서 가장 많이 필요한 부분 중 하나가 바로 파일 입출력입니다. 내가 사용한, 내가 이용한 정보들을 저장해야 할 필요가 있습니다. 데이터베이스(DB)에 저장할 수도 있지만 파일로 출력해서 저장할 수도 있습니다. 또 저장해 놓은 파일을 읽어서 추가적인 작업도 가능합니다.

 

이번 포스팅에서는 C언어에서 파일을 다루는 방법에 대해서 알아보도록 하겠습니다.


파일의 종류

파일을 다루기 위해서는 종류를 알아야 합니다. 파일의 종류에는 두 가지 정도의 대표적인 종류가 있습니다.

 

  • 텍스트 파일 (Text files)
  • 바이너리 파일 (Binary files)

텍스트 파일과 바이너리 파일이 어떤 점이 다른지 알아보겠습니다.


텍스트 파일(Text files)

텍스트 파일은 보통 우리가 아는 파일입니다. 확장자는 .txt로 된 파일이죠. 사람의 눈으로 쉽게 읽을 수 있는 파일입니다. 그래서 보통은 Notepad와 같은 문서편집기에서 열어서 보거나 편집할 수 있는 파일의 형태입니다.

 

이러한 형태의 파일은 눈으로 확인 가능하기 때문에 수정이 편리합니다. 읽기도 편하죠. 하지만 데이터가 그대로 노출되는 문제가 발생할 수 있는 파일의 형태입니다.


바이너리 파일(Binary files)

바이너리 파일은 컴퓨터를 위한 파일입니다. 그래서 우리가 눈으로 식별할 수 있는 데이터가 아닌 기계가 식별할 수 있는 0 또는 1로 만들어진 데이터를 저장한 파일의 형태입니다.

 

바이너리 파일은 텍스트에 비해서 더 많은 양을 저장할 수 있지만, 눈으로는 식별이 쉽지 않고 데이터가 그대로 노출되지는 않기 때문에 조금은 더 안전합니다.


파일 포인터 file pointer

파일을 다루기 위해서는 우선적으로 파일 포인터를 사용합니다. 그래서 포인터의 사용법을 아셔야 합니다.

2020.10.31 - [쿤즈 Dev/C] - [C언어] C언어의 꽃. 포인터를 알아보자!

파일 포인터는 다음과 같이 사용합니다.

FILE *fp;

자료형을 사용하는것과 같이 FILE이라는 타입으로 포인터 변수를 하나 선언합니다. 이로써 file을 다룰 준비가 되는 것입니다.


새로운 파일을 생성 또는 존재하는 파일을 오픈 fopen

가장 먼저 알아야 할 함수는 파일을 오픈하는 함수입니다. 이 함수 fopen() 함수입니다. 함수의 사용법은 아래와 같습니다.

(FILE *) fopen("file path", "mode")

fopen() 함수는 parameter로 2개를 받습니다. 첫 번째 parameter는 파일이 있는 경로입니다. 이 경에는 파일의 확장자까지 입력해 주어야 합니다. 두 번째는 mode입니다. 모드는 여러 가지가 있습니다.

Mode 의미 파일 존재 여부
r Reading (읽기모드) 파일이 존재하지 않으면 NULL
rb Reading in binary (바이너리 읽기모드) 파일이 존재하지 않으면 NULL
w Writing (쓰기모드) 파일이 존재하면 덮어쓰기
파일이 존재하지 않으면 파일 생성
wb Writing in binary (바이너리 쓰기모드) 파일이 존재하면 덮어쓰기
파일이 존재하지 않으면 파일 생성
a Append (추가모드) 파일이 존재하지 않으면 파일 생성
ab Append in binary (바이너리 추가모드) 파일이 존재하지 않으면 파일 생성
r+ Reading & Writing (읽고 쓰기 모드) 파일이 존재하지 않으면 NULL
w+ Reading & Writing (읽고 쓰기 모드) 파일이 존재하지 않으면 NULL
a+ Reading & Writing (읽고 쓰기 모드) 파일이 존재하지 않으면 NULL

사용 방법은 이렇습니다.

fp = fopen("opentextfile.txt", "w")

FILE 타입으로 선언한 fp에 fopen() 함수의 return 값을 넣어줍니다. 이 경우는 opentextfile.txt파일의 쓰기 모드로 접근하려 합니다. 만약 파일이 존재하면 새롭게 덮어쓰고 존재하지 않으면 새로운 파일이 생성됩니다.


오픈된 파일 정상종료 fclose

파일을 쓰기 위해서 fopen()함수를 사용하였고 파일 포인터에 연결해 놨다면, 프로그램을 종료하기 전에는 반드시 연결된 포인터를 해제해 주어야 합니다. 포인터도 free() 함수를 사용해서 사용한 메모리를 해제했었던 것 기억나시나요?

 

오픈된 파일을 정상적으로 종료하기 위해서는 fclose() 함수를 사용합니다. 사용법은 이렇습니다.

fclose(FILE *);

fclose() 함수의 parameter는 연결된 파일 포인터입니다.


파일 다루기 예제

앞서 알아본 fopen() 과 fclose()를 이용해서 파일을 다루는 방법을 알아보겠습니다.


소스코드1 file1.c

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp;
    int number;
    
    fp = fopen("/Users/koon/fileopentest.txt", "w");
    if(fp == NULL) {
        printf("File open failed..");
        exit(1);
    }
    
    printf("데이터를 입력하세요 : ");
    scanf("%d", &number);
    
    fprintf(fp, "%d", number);
    fclose(fp);
    
    return 0;
}

결과1

데이터를 입력하세요 : 30
Program ended with exit code: 0

FILE 포인터 변수 fp를 선언하고 fopen() 함수를 이용해서 fileopentest.txt라는 파일을 생성하도록 했습니다. "w" 옵션을 이용해서 파일이 없으면 생성하도록 설정하였습니다.

 

만약 fp가 NULL이 나온다는 것은 정상적으로 파일이 오픈되지 못했음을 의미하므로 체크해주도록 합니다.

 

숫자 하나를 number 변수에 받고 이를 fprintf() 함수에 다시 쓰도록 했습니다. 만약 키보드로부터 직접 받아서 바로 쓰고 싶다면 fprintf() 함수가 아닌 fscanf() 함수를 사용하시면 됩니다.


이번 포스팅에서는 파일을 다루는 방법을 알아보았습니다. 기본적으로 포인터를 사용해야 하기 때문에 어려움을 느낄 수 있습니다. 하지만 C언어에서는 포인터, 함수, 구조체, 파일 이 네 가지가 주를 이루는 프로그램이기 때문에 자주 사용해서 익숙해지면 쉽게 느낄 수 있는 부분입니다. 도움이 되셨으면 합니다. 이상입니다.

댓글