다음을 통해 공유


fopen_s, _wfopen_s

파일을 엽니다. 이러한 버전의 fopen,_wfopenCRT의 보안 기능에 설명된 대로 보안 향상 기능이 포함됩니다.

errno_t fopen_s( 
   FILE** pFile,
   const char *filename,
   const char *mode 
);
errno_t _wfopen_s(
   FILE** pFile,
   const wchar_t *filename,
   const wchar_t *mode 
);

매개 변수

  • [out] pFile
    파일 포인터의 포인터는 열려 있는 파일에 대한 포인터를 받을 포인터

  • [in] filename
    파일이름

  • [in] mode
    허용 되는 액세스 유형

반환 값

성공 시 0이고, 실패 시 오류 코드입니다. 이 오류에 대한 자세한 내용은 errno, _doserrno, _sys_errlist 및 _sys_nerr 를 참조하십시오.

오류 조건

pFile

filename

mode

반환 값

pFile 의 내용입니다.

NULL

any

any

EINVAL

변경 안 됨

any

NULL

any

EINVAL

변경 안 됨

any

any

NULL

EINVAL

변경 안 됨

설명

다음 fopen_s 및 _wfopen_s 에 의해 열려진 파일들은 공유할 수 없습니다. 파일을 공유하는 것이 필요한 경우, _fsopen, _wfsopen 를 적절한 공유 모드 상수와 사용합니다.-예를 들어, _SH_DENYNO 읽기/쓰기 공유 합니다.

함수 fopen_s 는 filename에 지정된 파일을 엽니다. _wfopen_s는 fopen_s의 와이드 문자 버전이며, _wfopen_s에 대한 인수는 와이드 문자 문자열입니다. 그렇지 않으면 _wfopen_s 및 fopen_s 는 동일하게 작동합니다.

fopen_s 는 실행 시점에서 파일 시스템에 사용할 수 있는 경로를 허용합니다.; UNC 경로와 매핑된 네트워크 드라이브를 포함 하는 경로는 시스템에서 코드를 실행 하는 공유에 액세스 또는 매핑된 네트워크 드라이브의 실행 시간에 fopen_s 에 의해 허용 됩니다. 경로를 fopen_s로 생성할 때, 실행 환경에서 드라이브, 경로, 또는 네트워크 공유의 사용 가능 여부에 대한 가정을 하지 않습니다. 슬래시(/) 또는 백슬래시(\)를 경로의 디렉터리 구분 기호로 사용할 수 있습니다.

이러한 함수는 해당 함수 매개 변수의 유효성을 검사합니다. 만약 pFile, filename, 또는 mode 가 null 포인터이면, 함수들은 매개 변수 유효성 검사에 설명된 대로, 잘못된 예외 매개 변수가 생성됩니다.

파일에서 추가작업을 수행하기 전에 함수가 성공하는지를 보려면, 항상 반환 값을 확인해야 합니다. 오류가 발생 하면, 오류 코드가 반환되고 전역 변수 errno 설정 됩니다. 자세한 내용은 errno, _doserrno, _sys_errlist 및 _sys_nerr을 참조하십시오.

유니코드 지원

fopen_s은 유니코드 파일 스트림을 지원합니다. 새로운 또는 기존 유니코드 파일을 열려면, fopen_s에 인코딩을 지정하는 ccs 플래그를 전달해야 합니다.

fopen_s(&fp, "newfile.txt", "rw, ccs=encoding");

encoding의 허용 값은 UNICODE, UTF-8 및 UTF-16LE입니다. 만약 encoding에 지정된 값이 없으면, fopen_s 은 ANSI 인코딩을 사용 합니다.

이미 파일이 존재하고 읽기 또는 첨부를 위해 열려져 있으면, 바이트 순서 표시 (BOM)가, 현재 파일에 있는 경우, 인코딩을 결정 합니다. BOM 인코딩은 ccs 플래그에 의해 지정된 인코딩을 우선으로 합니다. 다음 ccs 인코딩은 해당 파일이 새 파일인 경우 또는 BOM 없는 경우에 사용 됩니다

참고

BOM 검색은 유니코드 모드에서 열려 있는 파일에만 적용 됩니다.; 즉, ccs 플래그 전달에 의해서 입니다.

다음 표에서 다양한 fopen_s 와 파일에서 바이트 순서 표시하는 ccs 플래그를 위한 모드를 요약합니다.

ccs 플래그 및 BOM을 기반으로 사용되는 인코딩

ccs 플래그

BOM이 없거나 새 파일

BOM: UTF-8

BOM: UTF-16

UNICODE

UTF-16LE

UTF-8

UTF-16LE

UTF-8

UTF-8

UTF-8

UTF-16LE

UTF-16LE

UTF-16LE

UTF-8

UTF-16LE

유니코드 모드에서 쓰기 위해 열려 있는 파일들은 자동으로 BOM을 갖습니다.

만약 mode 이 "a, ccs=<encoding>" 이면, fopen_s 는 먼저 읽기 권한 및 쓰기 권한을 모두 사용하여 파일을 열려고 시도합니다. 성공하면, 함수가 파일을 인코딩하는 것을 결정하기 위해 BOM을 읽습니다.; 실패하면, 함수는 파일의 기본 인코딩을 사용합니다. 두 경우 모두, fopen_s 다음 쓰기 전용 권한으로 파일을 다시 엽니다. (이것은 a 모드에 대해서만 아니라 a+에도 적용합니다.)

제네릭 텍스트 라우팅 매핑

TCHAR.H 루틴

_UNICODE 및 _MBCS 정의되지 않음

_MBCS 정의됨

_UNICODE 정의됨

_tfopen_s

fopen_s

fopen_s

_wfopen_s

문자열 mode 은 다음과 같이 요청된 파일에 요구 되는 액세스 종류를 지정합니다.

  • "r"
    읽기 위해 엽니다. 파일이 없거나 찾을 수 없는 경우 fopen_s 호출이 실패합니다.

  • "w"
    쓰기 위해 빈 파일을 엽니다. 파일이 있으면 이 파일의 내용은 삭제됩니다.

  • "a"
    파일에 새 데이터를 쓰기 전에 EOF 마커를 제거 하지 않고 (추가) 파일의 끝에 쓰기 위해 엽니다. 파일이 없는 경우 파일을 만듭니다.

  • "r+"
    읽고 쓰기 위해 엽니다. (파일이 존재 해야 합니다.)

  • "w+"
    읽고 쓰기 위해 빈 파일을 엽니다. 파일이 있으면 이 파일의 내용은 삭제됩니다.

  • "a+"
    읽고 추가하기 위해 엽니다. 파일에 새로운 데이터가 쓰여지고 작성이 완료된 후 EOF 마커가 복원 되기 전에, 추가 작업은 EOF 마커 제거를 포함합니다. 파일이 없는 경우 파일을 만듭니다.

다음 "a" 또는 "a+" 액세스 형식에 의해 파일이 열릴 때, 모든 쓰기 작업은 파일의 끝에서 발생합니다. 파일 포인터는 fseek 또는 rewind를 사용하여 위치를 변경할 수 있습니다. 하지만 기존 데이터를 덮어쓸 수 없도록 작업이 수행 되어 쓰기 전에 항상 다시 파일의 끝으로 이동해야 합니다.

이 "a" 모드는 파일에 추가 하기 전에 EOF 마커를 제거하지 않습니다. 추가가 발생 한 후, MS-DOS TYPE은 원래 EOF 마커에 추가되는 데이터를 보여주는 것을 명령합니다. 이 "a+" 모드는 파일에 추가 하기 전에 EOF 마커를 제거합니다. 추가 후에는 MS-DOS TYPE 명령으로 파일의 모든 데이터를 표시합니다. 이 "a+" 모드는 CTRL + Z EOF 마커를 사용하여 종료되는 스트림 파일에 추가해야 합니다.

다음 "r+", "w+", 또는 "a+" 액세스 유형이 지정 되면, 읽기와 쓰기가 허용됩니다. ("업데이트"를 위해 열려질 파일입니다.) 하지만 읽기에서 쓰기로 전환할 경우 입력 작업 시 EOF 표식이 필요합니다. 만약 EOF가 없으면, 중간에 파일 위치 지정 함수 호출을 사용해야 합니다. 파일 위치 지정 함수는 fsetpos, fseek, 및 rewind입니다. 읽기와 쓰기를 전환할 때, 중간에 호출 fflush 또는 파일 위치 지정 함수를 사용해야 합니다.

위의 값을 추가하기 위해, 다음 문자가 mode 에 줄 바꿈 문자에 대한 변환 모드를 지정하기 위해 포함되어 질 수 있습니다.

  • t
    텍스트(변환됨) 모드에서 엽니다. 이 모드에서, CTRL + Z는 입력에서의 파일의 마지막 특성으로 해석됩니다. 읽기/쓰기로 "a+"로 열린 파일에서, fopen_s 는 파일의 마지막에서 CTRL + Z로 확인하고, 가능하면 제거 합니다. 이것은 fseek 및 ftell 을 사용하여 CTRL + Z로 종료되는 파일 내에서 이동하기 때문에 fseek 이 파일의 끝 부분에 제대로 동작 하지 않게 되는 것의 원인이 된다.

또한, 텍스트 모드에서, 캐리지 – 줄 바꿈 조합은 입력시 한줄 바꿈으로 변환되고, 줄 바꿈 문자들은 출력시 캐리지 – 줄 바꿈 조합으로 변환됩니다. 유니코드 스트림 I/O 함수가 텍스트 모드에서 작동할 경우(기본값) 소스 또는 대상 스트림은 멀티바이트 문자 시퀀스로 간주됩니다. 따라서 유니코드 스트림 입력 함수는 멀티바이트 문자를 와이드 문자로 변환합니다(mbtowc 함수를 호출한 것으로 간주). 마찬가지로 유니코드 스트림 출력 함수는 와이드 문자를 멀티바이트 문자로 변환합니다(wctomb 함수를 호출한 것으로 간주).

  • b
    이진(변환되지 않음) 모드에서 엽니다. 캐리지 리턴 및 줄 바꿈 문자를 포함하는 변환은 표시되지 않습니다.

t 또는 b가 mode에 지정되지 않은 경우, 기본 변환 모드는 전역 변수 _fmode로 정의됩니다. t 또는 b가 인수에 접두어로 추가되면 이 함수는 실행되지 못하고 NULL을 반환합니다.

텍스트 및 유니코드 이진 모드와 멀티 바이트 스트림 I/O 사용에 대 한 자세한 내용은 텍스트 및 이진 모드 파일 I/O텍스트 및 이진 모드에서 유니코드 스트림 I/O을 참조하십시오.

  • c
    fflush 또는 _flushall을 호출하면 파일 버퍼의 내용이 디스크에 직접 기록되도록 연결된 filename에 대한 커밋 플래그를 사용합니다.

  • n
    연결된 filename에 대한 커밋 플래그를 "커밋 안 함"으로 다시 설정합니다. 이 값이 기본값입니다. 또한 프로그램을 COMMODE.OBJ와 연결할 경우 전역 커밋 플래그를 재정의합니다. 프로그램을 COMMODE.OBJ와 명시적으로 연결하지 않을 경우 전역 커밋 플래그 기본값은 "커밋 안 함"입니다(링크 옵션 참조).

  • N
    자식 프로세스에서 파일을 상속하지 않도록 지정합니다.

  • S
    캐싱이 디스크에서 순차적 액세스를 위해 최적화되며 이에 제한되지 않습니다.

  • R
    캐싱이 디스크에서 임의 액세스를 위해 최적화되며 이에 제한되지 않습니다.

  • T
    파일을 임시 파일로 지정합니다. 가능하면 디스크에 플러시되지 않습니다.

  • D
    파일을 임시 파일로 지정합니다. 마지막 파일 포인터를 닫을 때 삭제됩니다.

  • ccs=ENCODING
    이 파일에서 (utf-8, u t F-16LE와 유니코드)을 사용하기 위해 코딩된 문자 집합을 지정합니다. 만약 ANSI인코딩을 하려면 지정하지 않습니다.

다음 fopen_s 및 _fdopen 에 사용되는 문자열 mode 에 유효한 문자는 _open_sopen와 같이 인수에 사용되는 oflag 와 일치합니다.

모든 문자열의 문자

_open/_sopen에 대해 동일한 oflag 값

a

_O_WRONLY | _O_APPEND (일반적으로 _O_WRONLY | _O_CREAT |_O_APPEND입니다.)

a+

_O_RDWR | _O_APPEND (일반적으로 _O_RDWR | _O_APPEND | _O_CREAT 입니다.)

r

_O_RDONLY

r+

_O_RDWR

w

_O_WRONLY (일반적으로 _O_WRONLY |_O_CREAT | _O_TRUNC입니다.)

w+

_O_RDWR(일반적으로 _O_RDWR | _O_CREAT | _O_TRUNC)

b

_O_BINARY

t

_O_TEXT

c

없음

n

없음

S

_O_SEQUENTIAL

R

_O_RANDOM

T

_O_SHORTLIVED

D

_O_TEMPORARY

ccs=UNICODE

_O_WTEXT

ccs=UTF-8

_O_UTF8

ccs=UTF-16LE

_O_UTF16

만약 rb 모드를 사용하는 경우, 코드를 이식 하거나 많은 파일을 읽을 필요가 없으며 /또한 네트워크 성능과 Win32 파일에 맵핑된 메모리를 고려하지 않아도 되는 것은 옵션이 될 수 있습니다.

요구 사항

Function

필수 헤더

fopen_s

<stdio.h>

_wfopen_s

<stdio.h> 또는 <wchar.h>

호환성에 대한 자세한 내용은 소개 단원의 호환성 부분을 참조하십시오.

라이브러리

모든 버전의 C 런타임 라이브러리입니다.

다음 c, n, 및 t mode 옵션들은 Microsoft 확장명이며 fopen_s 및 _fdopen 및 ANSI 이식성이 필요한 곳에 사용할 수 없습니다.

예제

// crt_fopen_s.c
// 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 )
{
   errno_t err;

   // Open for read (will fail if file "crt_fopen_s.c" does not exist)
   err  = fopen_s( &stream, "crt_fopen_s.c", "r" );
   if( err == 0 )
   {
      printf( "The file 'crt_fopen_s.c' was opened\n" );
   }
   else
   {
      printf( "The file 'crt_fopen_s.c' was not opened\n" );
   }

   // Open for write 
   err = fopen_s( &stream2, "data2", "w+" );
   if( err == 0 )
   {
      printf( "The file 'data2' was opened\n" );
   }
   else
   {
      printf( "The file 'data2' was not opened\n" );
   }

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

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

해당 .NET Framework 항목

참고 항목

참조

스트림 I/O

fclose, _fcloseall

_fdopen, _wfdopen

ferror

_fileno

freopen, _wfreopen

_open, _wopen

_setmode