티스토리 뷰


0x01 What is File access mode?


C언어에서 파일 입출력을 사용하기 위해서는 우선 파일을 열어야 한다. 파일을 개방한다는 의미는 프로그렘과 파일 간의 Stream을 생성한다는 뜻이다. 이 Stream을 생성해주는 메소드가 바로 fopen인데 이 함수의 원형을 살펴보자.



FILE* fopen(

const char *filename,

const char *mode

);



Parameters


filename

Filename.

mode

Type of access permitted.


 
Return Value


Each of these functions returns a pointer to the open file. A null pointer value indicates an error. If filename or mode is NULL or an empty string, these function trigger the invalid parameter handler, as described in Parameter Validation. If execution is allowed to continue, these functions return NULL and set errno to EINVAL.



위의 표를 살펴보면 fopen함수는 매개변수가 2개 필요한데 *filename은 말 그대로 파일의 경로와 이름을 설정하는 것이고,  mode는 어떤 방식으로 해당 파일에 접근 할 것인지를 설정하는 것이다. 오늘 소개할 File access mode는 바로 이 mode에 들어갈 수 있는 매개변수를 뜻한다.




0x02 File access mode


파일 접근 모드는 fopen함수를 통해 개방 할 파일에 어떤 방식으로 접근 할 것인지를 설정한다. 아래 표는 여러가지 모드 중 가장 자주 쓰이는 모드 6가지를 정리 한 것이다. 참고하도록 하자.


 모드

의미 

r 

- 파일을 읽기 위해서 개방한다. 오로지 읽는 것만 가능하다.

w

- 데이터를 쓰기 위해 개방한다. 오로지 쓰는 것만 가능 하다.

- 만약에 fopen 함수 호출 시 지정해 준 파일이 존재하지 않으면, 새로운 파일을 생성해서 데이터 를 쓰게된다.

- 지정해 준 파일이 존재하면, 그 파일의 데이터를 지워버리고 데이터를 쓰게 된다.

a

- w 모드와 달리, 지정해 준 파일이 존재하면 데이터를 지우지 않고 파일의 끝에서부터 데이터를 추가한다.

-  나미지 특징은 w 모드와 동일.

r+

- 파일을 읽고 쓰기 위해 개방한다.

- 파일이 존재하지 않는 경우, 새로운 파일을 생성한다.

- 파일이 존재하는 경우, 파일의 데이터를 지우지는 않지만 원래 존재하는 파일의 데이터를 덮어쓰게 된다.

w+

- r+ 모드와 달리, 지정해 준 파일이 존재하면 모든 데이터를 지워버리고 데이터를 기록한다.

- 나머지 특징은 r+ 모드와 같다

a+

- r+ 모드와 달리, 지정해 준 파일이 존재하면 파일의 끝에서부터 데이터를 추가한다(나머지 특징은 r+와 같다). 


참고로 r+, w+, a+ 모드는 읽기와 쓰기가 동시에 가능해서 더 유용하다고 생각할 지 모르겠다.그러나 이러한 모드를 기반으로 읽기에서 쓰기, 혹은 쓰기에서 읽기로 작업을 변경할 때마다 입-출력 버퍼를 비워주는 작업을 해 줘야 한다. 따라서 보통은 읽기(r), 쓰기(w) 혹은 추가(a) 모드를 사용하는 것이 일반적이다.




0x03 Example


// crt_fopen.c
// compile with: /W1
// This program opens two files. It uses
// fclose to close the first file and
// _fcloseall to close all remaining files.

#include <stdio.h>

FILE *stream, *stream2;

int main( void )
{
   int numclosed;

   // Open for read (will fail if file "crt_fopen.c" does not exist)
   if( (stream  = fopen( "crt_fopen.c", "r" )) == NULL ) // C4996
   // Note: fopen is deprecated; consider using fopen_s instead
      printf( "The file 'crt_fopen.c' was not opened\n" );
   else
      printf( "The file 'crt_fopen.c' was opened\n" );

   // Open for write 
   if( (stream2 = fopen( "data2", "w+" )) == NULL ) // C4996
      printf( "The file 'data2' was not opened\n" );
   else
      printf( "The file 'data2' was opened\n" );

   // Close stream if it is not NULL 
   if( stream)
   {
      if ( fclose( stream ) )
      {
         printf( "The file 'crt_fopen.c' was not closed\n" );
      }
   }

   // All other files are closed: 
   numclosed = _fcloseall( );
   printf( "Number of files closed by _fcloseall: %u\n", numclosed );
}





참고 : MSDN, 열혈강의 C 프로그래밍

'Programming > C' 카테고리의 다른 글

C :: scanf 공백 입력받기  (1) 2018.07.02
C :: ASCII Table :: 아스키 코드 :: 아스키 코드표  (0) 2015.09.30
C :: system 함수  (0) 2013.03.11
댓글