본문 바로가기
Programming/MFC,C++

fopen 옵션및 예제

by 기적 2013. 4. 1.

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

위와 같이 fopen() 함수의 2번째 파라미터가 mode 스트링입니다. 파일을 어떤 모드로 열지를 결정하는 곳입니다.



이것은 볼랜드C++의 레퍼런스에 있는, mode 스트링 설명을 번역한 것입니다.

r : Open for reading only. (읽기 전용으로 열기)

w : Create for writing. If a file by that name already exists, it will be overwritten.
    (쓰기용으로 파일 만들기. 같은 이름이 있다면 덮어쓰기)

a : Append; open for writing at end-of-file or create for writing if the file does not exist.
    (같은 이름의 파일이 이미 있다면, 그 파일 끝에 추가하여 쓰기,
    같은 이름의 파일이 없다면. 쓰기용으로 파일 만들기)

r+ : Open an existing file for update (reading and writing).
    (이미 있는 파일을, 읽기/쓰기용으로 열어 업데이트)

w+ : Create a new file for update (reading and writing). If a file by that name already exists, it will be overwritten.
    (읽기/쓰기용으로 파일 만들기. 같은 이름의 파일이 이미 있다면 덮어쓰기)

a+ : Open for append; open (or create if the file does not exist) for update at the end of the file.
    (파일을 열어서, 끝부분에 추가하기. 파일이 없다면 만들어서.)

t : Text Mode (텍스트 모드로 열기)

b : Binary Mode (이진 파일 모드로 열기)




위의 mode 스트링은 다음과 같이 조합할 수 있습니다:

rt : 이미 존재하는 텍스트 파일을 읽기 전용으로 열기

rb : 이미 존재하는 이진 파일을 읽기 전용으로 열기

도스의 type 명령처럼 텍스트 파일을 화면에 출력하는 예제입니다. 최대한 간단히 만들기 위해, 명령행 옵션 해석 부분은 생략했습니다. 따라서 이 예제는 test.txt 라는 이름의 파일만 읽을 수 있습니다.


#include <stdio.h>
#include <stdlib.h> // exit() 함수를 위해

#define MAX_COLS 32768

int main() {
  FILE *in;
  char s[MAX_COLS]; // 행이 1줄씩 임시로 저장될 버퍼

  // fopen() 함수로 파일 열기
  if ( (in = fopen("test.txt", "rt")) == NULL) {
    fputs("Cannot open input file...\n", stderr);
    exit(1); // 모든 파일 닫고, 프로그램 종료
  }

  // 읽기 시작: 프로그램의 본체
  while (fgets(s, MAX_COLS, in) != NULL) {
    printf(s); // 한 줄씩 화면에 출력
  }

  fcloseall(); // 모든 파일 닫기
  return 0;
}

fgets() 함수가 행 1개를 읽어들이면 그 행이 char s 속에 들어갑니다.

파일 열기 함수인, fopen() 에서, "rt" 란, 파일을 "읽기 전용 모드 + 텍스트 파일 모드"로 열라는 의미입니다.

fgets() 함수는 텍스트 파일의 행 1개를 행의 끝까지 읽습니다. 그러나 읽을 수 있는 행의 길이에 제약이 있습니다. MAX_COLS 는 Maximum Columns 의 의미로서, 행의 최대 길이를 제가 미리 지정해 놓은 것입니다. fgets() 함수는, MAX_COLS 보다 긴 행은 더 읽지 못하지만, 행의 최대 길이를 32768 바이트로 지정해 주면 충분할 것입니다.

fgets() 함수는 텍스트 파일의 딱 1줄만 읽기 때문에, while 문으로 루프를 만들어야 파일의 모든 줄을 읽을 수 있습니다. != NULL 이라는 것은, NULL 이 나오지 않는 한, 계속 while 루프를 돌려라, 즉 파일의 끝까지 읽으라는 얘깁니다.

return 0; 라는 것은, main() 함수를 종료하고 0을 반환하라는 의미인데, main() 함수는 프로그램의 본체이므로, main() 함수에서 빠져나간다는 말은, 프로그램을 끝내라는 의미가 됩니다. 에러가 없으면 0을 반환하고, 에러가 있으면 0이 아닌 정수를 반환합니다.


이 예제 프로그램은, 하드의 현재 폴더에 test.txt 라는 이름의 텍스트 파일이 이미 있어야만 작동합니다. 그렇지 않으면 Cannot open input file... (입력 파일을 열 수 없습니다...) 이라는 에러가 나고 즉시 종료됩니다. test.txt 라는 파일을 메모장 등으로 만든 후, 적당한 텍스트를 카피해서 미리 만들어 두어야 합니다.


퍼옴


댓글