다음을 통해 공유


fopen_s, _wfopen_s

파일을 엽니다. 이러한 버전은 CRT_wfopenfopen 보안 기능에 설명된 대로 향상된 보안 기능을 제공합니다.

구문

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
);

매개 변수

pFile
열린 파일에 대한 포인터를 받는 파일 포인터에 대한 포인터입니다.

filename
열어야 할 파일의 이름입니다.

mode
허용되는 액세스 형식입니다.

반환 값

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

오류 조건

pFile filename mode Return Value pFile의 내용
NULL any any EINVAL 변경 안 됨
any NULL any EINVAL 변경 안 됨
any any NULL EINVAL 변경 안 됨

설명

fopen_s_wfopen_s 함수는 공유할 파일을 열 수 없습니다. 파일을 공유해야 하는 경우 적절한 공유 모드 상수(예: 읽기/쓰기 공유에 사용)를 사용 _fsopen _SH_DENYNO 하거나 _wfsopen 사용합니다.

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

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

이러한 함수는 해당 함수 매개 변수의 유효성을 검사합니다. null filename포인터인 mode 경우 pFile이러한 함수는 매개 변수 유효성 검사에 설명된 대로 잘못된 매개 변수 예외를 생성합니다.

파일에 대한 추가 작업을 수행하기 전에 항상 반환 값을 확인하여 함수가 성공했는지 확인합니다. 오류가 발생하면 오류 코드가 반환되고 전역 변수 errno 가 설정됩니다. 자세한 내용은 다음을 참조하세요.errno, _doserrno, _sys_errlist_sys_nerr.

기본적으로 이 함수의 전역 상태는 애플리케이션으로 범위가 지정됩니다. 변경하려면 CRT의 전역 상태를 참조하세요.

유니코드 지원

fopen_s 은 유니코드 파일 스트림을 지원합니다. 새 또는 기존 유니코드 파일을 열려면 원하는 인코딩을 지정하는 플래그를 fopen_s전달 ccs 합니다. 예를 들면 다음과 같습니다.

fopen_s(&fp, "newfile.txt", "w+, ccs=UNICODE");

플래그의 허용되는 값은 ccs UNICODE, UTF-8UTF-16LE. 값이 지정되지 ccsfopen_s 않은 경우 ANSI 인코딩을 사용합니다.

파일이 이미 있고 읽기 또는 추가를 위해 열려 있는 경우 파일에 있는 경우 BOM(바이트 순서 표시)이 인코딩을 결정합니다. BOM 인코딩이 ccs 플래그에 지정된 인코딩보다 우선합니다. ccs 인코딩은 BOM이 없거나 파일이 새 파일인 경우에만 사용됩니다.

참고 항목

BOM 검색은 유니코드 모드로 열려 있는 파일 즉, ccs 플래그를 전달하여 연 파일에만 적용됩니다.

다음 표에서는 파일의 BOM에 지정된 fopen_s 다양한 ccs 플래그 값에 대한 모드를 요약합니다.

플래그 및 BOM에 ccs 따라 사용되는 인코딩

ccs 플래그 BOM이 없거나 새 파일 BOM: UTF-8 BOM: UTF-16
UNICODE UTF-8 UTF-8 UTF-16LE
UTF-8 UTF-8 UTF-8 UTF-16LE
UTF-16LE UTF-16LE UTF-8 UTF-16LE

유니코드 모드에서 쓰도록 파일을 열면 BOM이 파일에 자동으로 기록됩니다.

fopen_s "a, ccs=UTF-16LE""a, ccs=UTF-8""a, ccs=UNICODE"mode 먼저 읽기 액세스 권한과 쓰기 권한으로 파일을 열려고 시도합니다. 성공하면 함수가 BOM을 읽어서 파일에 대한 인코딩을 결정하고, 실패하면 함수가 파일에 대한 기본 인코딩을 사용합니다. 두 경우 fopen_s 모두 쓰기 전용 액세스 권한으로 파일을 다시 엽니다. (이 동작은 .가 아닌 a+모드에 a 만 적용됩니다.)

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

mode Access
"r" 읽기 위해 엽니다. 파일이 없거나 찾을 수 없는 경우 호출이 fopen_s 실패합니다.
"w" 쓰기 위해 빈 파일을 엽니다. 지정한 파일이 있으면 이 파일의 내용은 삭제됩니다.
"a" 새 데이터를 파일에 쓰기 전에 EOF(파일 끝) 표식을 제거하지 않고 파일의 끝에 쓰기(추가)하기 위해 엽니다. 파일이 없는 경우 파일을 만듭니다.
"r+" 읽고 쓰기 위해 엽니다. 파일이 있어야 합니다.
"w+" 읽고 쓰기 위해 빈 파일을 엽니다. 파일이 있으면 이 파일의 내용은 삭제됩니다.
"a+" 읽고 추가하기 위해 엽니다. 추가 작업에는 새 데이터를 파일에 쓰기 전에 EOF 표식을 제거하는 작업이 포함됩니다. 쓰기가 완료된 후에는 EOF 표식이 복원되지 않습니다. 파일이 없는 경우 파일을 만듭니다.

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

이 모드는 "a" 파일에 추가하기 전에 EOF 마커를 제거하지 않습니다. 추가가 발생한 후 MS-DOS TYPE 명령은 원래 EOF 표식까지의 데이터만 표시하고 파일에 추가된 데이터는 표시하지 않습니다. "a+" 모드에서는 파일에 추가하기 전에 EOF 표식을 제거합니다. 추가한 후 MS-DOS TYPE 명령은 파일의 모든 데이터를 표시합니다. "a+" Z EOF 표식으로 종료되는 스트림 파일에 추가하려면 모드가CTRL+ 필요합니다.

"r+"또는 "w+""a+" 액세스 형식을 지정하면 읽기 및 쓰기가 모두 허용됩니다. (파일은 "update"에 대해 열려 있다고 합니다.) 그러나 읽기에서 쓰기로 전환할 때 입력 작업은 EOF 표식에 와야 합니다. EOF 표식이 없는 경우 파일 위치 지정 함수에 대한 중간 호출을 사용해야 합니다. 파일 위치 지정 함수는 fsetpos, fseekrewind입니다. 쓰기에서 읽기로 전환할 경우 사이에 fflush 또는 파일 위치 지정 함수를 호출해야 합니다.

C11부터 파일을 덮어쓰는 대신 파일이 있는 경우 함수에 추가 "x" "w" 하거나 "w+" 실패할 수 있습니다.

이전 값 외에도 다음 문자를 포함하여 줄 바꿈 문자에 mode 대한 번역 모드를 지정할 수 있습니다.

mode 한정자 번역 모드
t 텍스트(변환됨) 모드에서 엽니다. CR-LF(캐리지 리턴 라인 피드) 조합은 입력에서 LF(단일 줄 바꿈)로 변환되고 LF 문자는 출력에서 CR-LF 조합으로 변환됩니다. Ctrl+Z는 입력에서 파일 끝 문자로 해석됩니다.
b 이진(변환되지 않은) 모드로 열기; 캐리지 리턴 및 줄 바꿈 문자와 관련된 번역은 표시되지 않습니다.

텍스트(번역) 모드 CTRL+에서 Z 는 입력에서 파일 끝 문자로 해석됩니다. 읽기/쓰기 "a+"fopen_s 를 위해 열린 파일의 경우 파일 끝에 있는+CTRL Z를 확인하고 가능한 경우 제거합니다. ZCTRL+끝나는 파일 내에서 사용 fseekftell 이동하면 파일 끝부분에 부적절하게 동작할 수 fseek 있으므로 제거됩니다.

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

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

유니코드 및 멀티바이트 stream-I/O에서 텍스트 및 이진 모드를 사용하는 방법에 대한 자세한 내용은 텍스트 및 이진 모드의 텍스트 및 이진 모드 파일 I/O유니코드 스트림 I/O를 참조하세요.

mode 한정자 동작
c filename 또는 fflush 을 호출하면 파일 버퍼의 내용이 디스크에 직접 기록되도록 연결된 _flushall 에 대한 커밋 플래그를 사용합니다.
n 연결된 filename "no-commit"에 대한 커밋 플래그를 다시 설정합니다. 이 플래그는 기본값입니다. 또한 프로그램을 COMMODE.OBJ.에 연결하는 경우 전역 커밋 플래그를 재정의합니다. 프로그램을 COMMODE.OBJ 명시적으로 연결하지 않는 한 전역 커밋 플래그 기본값은 "no-commit"입니다(링크 옵션 참조).
N 자식 프로세스에서 파일을 상속하지 않도록 지정합니다.
S 캐싱이 디스크에서 순차적 액세스를 위해 최적화되며 이에 제한되지 않습니다.
R 캐싱이 디스크에서 임의 액세스를 위해 최적화되며 이에 제한되지 않습니다.
T 메모리 압력이 필요하지 않은 한 디스크에 기록되지 않은 파일을 지정합니다.
D 마지막 파일 포인터를 닫을 때 삭제되는 임시 파일을 지정합니다.
ccs=UNICODE 이 파일에 사용할 인코딩된 문자 집합으로 UNICODE를 지정합니다. ANSI 인코딩을 원할 경우 지정되지 않은 상태로 둡니다.
ccs=UTF-8 이 파일에 사용할 인코딩된 문자 집합으로 UTF-8을 지정합니다. ANSI 인코딩을 원할 경우 지정되지 않은 상태로 둡니다.
ccs=UTF-16LE UTF-16LE을 이 파일에 사용할 인코딩된 문자 집합으로 지정합니다. ANSI 인코딩을 원할 경우 지정되지 않은 상태로 둡니다.

사용된 문자열에 mode 유효한 문자이며 _fdopen 다음과 같이 사용된 _open 인수에 _sopen해당 oflag 합니다.fopen_s

mode 문자열의 문자 _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 None
n None
D _O_TEMPORARY
R _O_RANDOM
S _O_SEQUENTIAL
T _O_SHORTLIVED
ccs=UNICODE _O_WTEXT
ccs=UTF-8 _O_UTF8
ccs=UTF-16LE _O_UTF16

cANSI 이식성을 원하는 경우 , RnS, tTmode D 옵션은 Microsoft 확장 fopen_s 이며 _wfopen_s 사용해서는 안 됩니다.

모드를 사용하는 rb 경우 코드를 이식할 필요가 없거나, 파일을 많이 읽을 것으로 예상하거나, 네트워크 성능에 신경 쓰지 않는 경우 메모리 매핑 Win32 파일도 옵션이 될 수 있습니다.

관련 사항 TD:

  • T 메모리 압력이 필요하지 않은 한 디스크에 파일을 쓰지 않습니다. 자세한 내용은 파일 특성 상수 및 이 블로그 게시물에서 임시로만 참조 FILE_ATTRIBUTE_TEMPORARY 하세요.
  • D 는 디스크에 기록되는 일반 파일을 지정합니다. 차이점은 닫히면 자동으로 삭제된다는 것입니다. 결합 TD 하여 두 의미 체계를 모두 가져올 수 있습니다.

요구 사항

함수 필수 헤더 C++ 헤더
fopen_s <stdio.h> <cstdio>
_wfopen_s <stdio.h> 또는 <wchar.h> <cstdio>

C 런타임 라이브러리의 표준 규칙 및 명명 규칙에 대한 자세한 내용은 호환성을 참조하세요.

일반 텍스트 루틴 매핑

<tchar.h> 루틴 _UNICODE_MBCS 정의되지 않음 정의된 _MBCS 정의된 _UNICODE
_tfopen_s fopen_s fopen_s _wfopen_s

라이브러리

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

예시

// 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" doesn't 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+, ccs=UTF-8" );
   if( err == 0 )
   {
      printf( "The file 'data2' was opened\n" );
   }
   else
   {
      printf( "The file 'data2' was not opened\n" );
   }

   // Close stream if it isn't 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 );
}
The file 'crt_fopen_s.c' was opened
The file 'data2' was opened
Number of files closed by _fcloseall: 1

참고 항목

스트림 I/O
fclose, _fcloseall
_fdopen, _wfdopen
ferror
_fileno
freopen, _wfreopen
_open, _wopen
_setmode