fopen_s, _wfopen_sfopen_s, _wfopen_s

파일을 엽니다.Opens a file. 이러한 버전의에는 fopen, _wfopen CRT의 보안 기능에 설명 된 대로 향상 된 보안 기능이 포함 되어 있습니다.These versions of fopen, _wfopen have security enhancements, as described in Security Features in the CRT.

구문Syntax

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

매개 변수Parameters

pFile
열린 파일에 대한 포인터를 수신할 파일 포인터에 대한 포인터입니다.A pointer to the file pointer that will receive the pointer to the opened file.

filename
파일 이름입니다.Filename.

mode
허용되는 액세스 형식입니다.Type of access permitted.

반환 값Return Value

성공 시 0이고, 실패 시 오류 코드입니다.Zero if successful; an error code on failure. 이러한 오류 코드에 대 한 자세한 내용은을 참조 하십시오 errno, _doserrno, _sys_errlist, and _sys_nerr .For more information about these error codes, see errno, _doserrno, _sys_errlist, and _sys_nerr.

오류 조건Error Conditions

pFile filename mode 반환 값Return Value 내용 pFileContents of pFile
NULL anyany anyany EINVAL 변경 안 됨unchanged
anyany NULL anyany EINVAL 변경 안 됨unchanged
anyany anyany NULL EINVAL 변경 안 됨unchanged

설명Remarks

에서 열 수 있는 파일 fopen_s_wfopen_s 공유할 수 없습니다.Files that are opened by fopen_s and _wfopen_s aren't sharable. 파일을 공유할 수 있어야 하는 경우 _fsopen, _wfsopen _SH_DENYNO 읽기/쓰기 공유의 경우와 같이 적절 한 공유 모드 상수와 함께를 사용 합니다.If you require that a file be sharable, use _fsopen, _wfsopen with the appropriate sharing mode constant—for example, _SH_DENYNO for read/write sharing.

fopen_s 함수는 filename 으로 지정 된 파일을 엽니다.The fopen_s function opens the file that's specified by filename. _wfopen_s 는의 와이드 문자 버전 이며 fopen_s ,에 대 한 인수는 _wfopen_s 와이드 문자 문자열입니다._wfopen_s is a wide-character version of fopen_s; the arguments to _wfopen_s are wide-character strings. _wfopen_s 및는 동일 하 게 fopen_s 동작 합니다._wfopen_s and fopen_s behave identically otherwise.

fopen_s 는 실행 시점에 파일 시스템에 유효한 경로를 허용 합니다. 매핑된 네트워크 드라이브를 포함 하는 UNC 경로 및 경로는 fopen_s 실행 시 코드를 실행 하는 시스템에서 공유 또는 매핑된 네트워크 드라이브에 액세스할 수 있는 한에만 허용 됩니다.fopen_s accepts paths that are valid on the file system at the point of execution; UNC paths and paths that involve mapped network drives are accepted by fopen_s as long as the system that's executing the code has access to the share or mapped network drive at the time of execution. 에 대 한 경로를 생성할 때 fopen_s 실행 환경에서 드라이브, 경로 또는 네트워크 공유의 가용성을 가정 하지 마세요.When you construct paths for fopen_s, don't make assumptions about the availability of drives, paths, or network shares in the execution environment. 슬래시(/) 또는 백슬래시(\)를 경로의 디렉터리 구분 기호로 사용할 수 있습니다.You can use either forward slashes (/) or backslashes (\) as the directory separators in a path.

이러한 함수는 해당 함수 매개 변수의 유효성을 검사합니다.These functions validate their parameters. pFile, filename 또는 mode 가 null 포인터인 경우이 함수는 매개 변수 유효성 검사에 설명 된 대로 잘못 된 매개 변수 예외를 생성 합니다.If pFile, filename, or mode is a null pointer, these functions generate an invalid parameter exception, as described in Parameter Validation.

파일에서 추가 작업을 수행 하기 전에 항상 반환 값을 확인 하 여 함수가 성공 했는지 확인 합니다.Always check the return value to see if the function succeeded before you do any further operations on the file. 오류가 발생 하면 오류 코드가 반환 되 고 전역 변수가 errno 설정 됩니다.If an error occurs, the error code is returned and the global variable errno is set. 자세한 내용은 errno, _doserrno, _sys_errlist, and _sys_nerr을(를) 참조하세요.For more information, see errno, _doserrno, _sys_errlist, and _sys_nerr.

기본적으로이 함수의 전역 상태는 응용 프로그램으로 범위가 지정 됩니다.By default, this function's global state is scoped to the application. 이를 변경 하려면 CRT의 전역 상태를 참조 하세요.To change this, see Global state in the CRT.

유니코드 지원Unicode support

fopen_s 는 유니코드 파일 스트림을 지원 합니다.fopen_s supports Unicode file streams. 새 유니코드 파일이 나 기존 유니코드 파일을 열려면 원하는 인코딩을 지정 하는 ccs 플래그를 fopen_s 다음과 같이 전달 합니다.To open a new or existing Unicode file, pass a ccs flag that specifies the desired encoding to fopen_s:

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

Encoding 의 허용 되는 값은 UNICODE , UTF-8UTF-16LE 입니다.Allowed values of encoding are UNICODE, UTF-8, and UTF-16LE. 에 대해 지정 된 값이 없는 경우는 encoding fopen_s ANSI 인코딩을 사용 합니다.If there no value is specified for encoding, fopen_s uses ANSI encoding.

파일이 이미 있고 읽기 또는 추가용으로 열려 있는 경우 BOM(바이트 순서 표시)(파일에 있는 경우)에 따라 인코딩이 결정됩니다.If the file already exists and is opened for reading or appending, the Byte Order Mark (BOM), if present in the file, determines the encoding. BOM 인코딩은 플래그에 지정 된 인코딩에 우선 합니다 ccs .The BOM encoding takes precedence over the encoding that's specified by the ccs flag. ccs 인코딩은 BOM이 없거나 파일이 새 파일인 경우에만 사용 됩니다.The ccs encoding is only used when no BOM is present or if the file is a new file.

참고

BOM 검색은 유니코드 모드로 열려 있는 파일에만 적용 됩니다. 즉, 플래그를 전달 ccs 합니다.BOM-detection only applies to files that are opened in Unicode mode; that is, by passing the ccs flag.

다음 표에서는 ccs fopen_s 파일에서 및 바이트 순서 표시에 제공 되는 다양 한 플래그에 대 한 모드를 요약 합니다.The following table summarizes the modes for various ccs flags that are given to fopen_s and for Byte Order Marks in the file.

ccs 플래그 및 BOM을 기반으로 사용되는 인코딩Encodings Used Based on ccs Flag and BOM

ccs 플래그ccs flag BOM이 없거나 새 파일No BOM (or new file) BOM: UTF-8BOM: UTF-8 BOM: UTF-16BOM: 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이 파일에 자동으로 기록됩니다.Files that are opened for writing in Unicode mode have a BOM written to them automatically.

mode"a, ccs= encoding encoding " 인 경우는 fopen_s 먼저 읽기 액세스와 쓰기 권한을 모두 사용 하 여 파일을 열려고 시도 합니다.If mode is "a, ccs=encoding", fopen_s first tries to open the file with both read access and write access. 성공하면 함수가 BOM을 읽어서 파일에 대한 인코딩을 결정하고, 실패하면 함수가 파일에 대한 기본 인코딩을 사용합니다.If successful, the function reads the BOM to determine the encoding for the file; if unsuccessful, the function uses the default encoding for the file. 두 경우 모두 fopen_s 쓰기 전용 액세스 권한으로 파일을 다시 열립니다.In either case, fopen_s then reopens the file with write-only access. a 는 모드에만 적용 되 고는 적용 되지 않습니다 a+ .(This applies to a mode only, not a+.)

제네릭 텍스트 라우팅 매핑Generic-Text Routine Mappings

TCHAR.H 루틴TCHAR.H routine _UNICODE 및 _MBCS 정의되지 않음_UNICODE & _MBCS not defined _MBCS 정의됨_MBCS defined _UNICODE 정의됨_UNICODE defined
_tfopen_s fopen_s fopen_s _wfopen_s

문자열은 mode 다음과 같이 파일에 대해 요청 되는 액세스의 종류를 지정 합니다.The character string mode specifies the kind of access that's requested for the file, as follows.

mode AccessAccess
"r" 읽기 위해 엽니다.Opens for reading. 파일이 없거나 찾을 수 없는 경우 fopen_s 호출이 실패 합니다.If the file doesn't exist or cannot be found, the fopen_s call fails.
"w" 쓰기 위해 빈 파일을 엽니다.Opens an empty file for writing. 지정한 파일이 있으면 이 파일의 내용은 삭제됩니다.If the given file exists, its contents are destroyed.
"a" 새 데이터를 파일에 쓰기 전에 EOF(파일 끝) 표식을 제거하지 않고 파일의 끝에 쓰기(추가)하기 위해 엽니다.Opens for writing at the end of the file (appending) without removing the end-of-file (EOF) marker before new data is written to the file. 파일이 없는 경우 파일을 만듭니다.Creates the file if it doesn't exist.
"r+" 읽고 쓰기 위해 엽니다.Opens for both reading and writing. 파일이 있어야 합니다.The file must exist.
"w +""w+" 읽고 쓰기 위해 빈 파일을 엽니다.Opens an empty file for both reading and writing. 파일이 있으면 이 파일의 내용은 삭제됩니다.If the file exists, its contents are destroyed.
"a+" 읽고 추가하기 위해 엽니다.Opens for reading and appending. 추가 작업에는 새 데이터를 파일에 쓰기 전에 EOF 표식을 제거하는 작업이 포함됩니다.The appending operation includes the removal of the EOF marker before new data is written to the file. 쓰기가 완료 된 후 EOF 표식이 복원 되지 않습니다.The EOF marker isn't restored after writing is completed. 파일이 없는 경우 파일을 만듭니다.Creates the file if it doesn't exist.

파일이 또는 액세스 형식을 사용 하 여 열리면 "a" "a+" 모든 쓰기 작업이 파일 끝에서 발생 합니다.When a file is opened by using the "a" or "a+" access type, all write operations occur at the end of the file. 또는를 사용 하 여 파일 포인터의 위치를 변경할 수 fseek rewind 있지만, 기존 데이터를 덮어쓸 수 없도록 쓰기 작업을 수행 하기 전에 항상 파일 끝으로 다시 이동 합니다.The file pointer can be repositioned by using fseek or rewind, but it's always moved back to the end of the file before any write operation is carried out so that existing data cannot be overwritten.

"a" 모드는 파일에 추가 하기 전에 EOF 표식을 제거 하지 않습니다.The "a" mode doesn't remove the EOF marker before appending to the file. 추가가 발생 하면 MS-DOS TYPE 명령은 원본 EOF 표식 까지만 데이터를 표시 하 고 파일에 추가 된 데이터는 표시 하지 않습니다.After appending has occurred, the MS-DOS TYPE command only shows data up to the original EOF marker and not any data that's appended to the file. "a+" 모드는 파일에 추가 하기 전에 EOF 표식을 제거 합니다.The "a+" mode does remove the EOF marker before appending to the file. 추가 후에는 MS-DOS TYPE 명령이 파일의 모든 데이터를 표시 합니다.After appending, the MS-DOS TYPE command shows all data in the file. "a+" 이 모드는 EOF 표식으로 종료 되는 스트림 파일에 추가 하는 데 필요 CTRL+Z 합니다.The "a+" mode is required for appending to a stream file that is terminated with the CTRL+Z EOF marker.

"r+", "w+" 또는 "a+" 액세스 형식을 지정한 경우 읽기와 쓰기가 모두 허용 됩니다.When the "r+", "w+", or "a+" access type is specified, both reading and writing are allowed. 파일은 "업데이트" 용으로 열립니다. 그러나 읽기에서 쓰기로 전환 하는 경우 입력 작업은 EOF 표식에서 가져와야 합니다.(The file is said to be open for "update".) However, when you switch from reading to writing, the input operation must come across an EOF marker. EOF 표식이 없는 경우 파일 위치 지정 함수에 대 한 중간 호출을 사용 해야 합니다.If there's no EOF marker, you must use an intervening call to a file-positioning function. 파일 위치 지정 함수는 fsetpos , fseekrewind 입니다.The file-positioning functions are fsetpos, fseek, and rewind. 쓰기에서 읽기로 전환 하는 경우 fflush 또는 파일 위치 지정 함수에 대 한 중간 호출을 사용 해야 합니다.When you switch from writing to reading, you must use an intervening call to either fflush or to a file-positioning function.

위의 값 이외에 다음 문자를에 포함 mode 하 여 줄 바꿈 문자에 대 한 변환 모드를 지정할 수 있습니다.In addition to the values above, the following characters can be included in mode to specify the translation mode for newline characters:

mode modifiermode modifier 변환 모드Translation mode
t 텍스트(변환됨) 모드에서 엽니다.Open in text (translated) mode.
b 이진 (변환 되지 않음) 모드에서 열기 캐리지 리턴 및 줄 바꿈 문자를 포함 하는 변환은 표시 되지 않습니다.Open in binary (untranslated) mode; translations involving carriage-return and line feed characters are suppressed.

텍스트 (변환 됨) 모드에서 CTRL+Z 는 입력 시 파일 끝 문자로 해석 됩니다.In text (translated) mode, CTRL+Z is interpreted as an end-of-file character on input. 를 사용 하 여 읽기/쓰기용으로 열려 있는 파일에서 "a+" fopen_s 는 파일 끝에 있는을 확인 CTRL+Z 하 고 가능 하면 제거 합니다.In files opened for reading/writing with "a+", fopen_s checks for a CTRL+Z at the end of the file and removes it, if possible. 이 작업은 및를 사용 하 여 fseek ftell 로 끝나는 파일 내에서 이동 하면가 CTRL+Z fseek 파일 끝 부분에서 제대로 동작 하지 않을 수 있기 때문에 수행 됩니다.This is done because using fseek and ftell to move within a file that ends with a CTRL+Z, may cause fseek to behave improperly near the end of the file.

또한 텍스트 모드에서 캐리지 리턴/줄 바꿈 조합은 입력 시 단일 줄 바꿈으로 변환 되 고, 줄 바꿈 문자는 출력에서 캐리지 리턴-줄 바꿈 조합으로 변환 됩니다.Also, in text mode, carriage return/line feed combinations are translated into single line feeds on input, and line feed characters are translated to carriage return-line feed combinations on output. 유니코드 스트림 I/O 함수가 텍스트 모드에서 작동할 경우(기본값) 소스 또는 대상 스트림은 멀티바이트 문자 시퀀스로 간주됩니다.When a Unicode stream-I/O function operates in text mode (the default), the source or destination stream is assumed to be a sequence of multibyte characters. 유니코드 스트림 입력 함수는 멀티 바이트 문자를 와이드 문자로 변환 합니다 (함수를 호출한 것 처럼 mbtowc ).The Unicode stream-input functions convert multibyte characters to wide characters (as if by a call to the mbtowc function). 이와 같은 이유로 유니코드 스트림 출력 함수는 와이드 문자를 멀티 바이트 문자로 변환 합니다 (함수를 호출한 것 처럼 wctomb ).For the same reason, the Unicode stream-output functions convert wide characters to multibyte characters (as if by a call to the wctomb function).

t 에 또는가 b 지정 되지 않은 경우 mode 기본 변환 모드는 _fmode전역 변수에 의해 정의 됩니다.If t or b isn't given in mode, the default translation mode is defined by the global variable _fmode. t 또는 b 가 인수 앞에 붙는 경우 함수는 실패 하 고을 반환 NULL 합니다.If t or b is prefixed to the argument, the function fails and returns NULL.

텍스트 및 이진 모드를 유니코드 및 멀티바이트 스트림 I/O에서 사용하는 방법에 대한 자세한 내용은 텍스트 및 이진 모드 파일 I/O텍스트 및 이진 모드의 유니코드 스트림 I/O를 참조하세요.For more information about using text and binary modes in Unicode and multibyte stream-I/O, see Text and Binary Mode File I/O and Unicode Stream I/O in Text and Binary Modes.

mode modifiermode modifier 동작Behavior
c 또는가 호출 될 때 파일 버퍼의 내용이 디스크에 직접 기록 되도록 연결 된 파일 이름 에 대 한 커밋 플래그를 사용 하도록 설정 합니다 fflush _flushall .Enable the commit flag for the associated filename so that the contents of the file buffer are written directly to disk if either fflush or _flushall is called.
n 관련 파일 이름 에 대 한 커밋 플래그를 "커밋 안 함"으로 다시 설정 합니다.Reset the commit flag for the associated filename to "no-commit." 이것이 기본값입니다.This is the default. 또한 프로그램을 COMMODE.OBJ와 연결할 경우 전역 커밋 플래그를 재정의합니다.It also overrides the global commit flag if you link your program with COMMODE.OBJ. 프로그램을 COMMODE.OBJ와 명시적으로 연결하지 않을 경우 전역 커밋 플래그 기본값은 "커밋 안 함"입니다( Link Options참조).The global commit flag default is "no-commit" unless you explicitly link your program with COMMODE.OBJ (see Link Options).
n 자식 프로세스에서 파일을 상속 하지 않도록 지정 합니다.Specifies that the file isn't inherited by child processes.
S 캐싱이 디스크에서 순차적 액세스를 위해 최적화되며 이에 제한되지 않습니다.Specifies that caching is optimized for, but not restricted to, sequential access from disk.
R 캐싱이 디스크에서 임의 액세스를 위해 최적화되며 이에 제한되지 않습니다.Specifies that caching is optimized for, but not restricted to, random access from disk.
t 파일을 임시 파일로 지정합니다.Specifies a file as temporary. 가능 하면 디스크에 플러시되지 않습니다.If possible, it isn't flushed to disk.
D 파일을 임시 파일로 지정합니다.Specifies a file as temporary. 마지막 파일 포인터를 닫을 때 삭제 됩니다.It's deleted when the last file pointer is closed.
**ccs=**인코딩이**ccs=**encoding UTF-8 UTF-16LE 이 파일에 사용할 인코딩된 문자 집합 (, 또는 중 하나)을 지정 합니다 UNICODE .Specifies the encoded character set to use (one of UTF-8, UTF-16LE, or UNICODE) for this file. ANSI 인코딩을 원할 경우 지정되지 않은 상태로 둡니다.Leave unspecified if you want ANSI encoding.

및에서 사용 되는 문자열에 유효한 문자는 mode fopen_s _fdopen oflag 다음과 같이 및에 사용 되는 인수와 일치 _open _sopen 합니다.Valid characters for the mode string used in fopen_s and _fdopen correspond to oflag arguments used in _open and _sopen, as follows.

문자열의 문자 modeCharacters in mode string 에 해당 하는 oflag_open/_sopenEquivalent oflag value for _open/_sopen
a _O_WRONLY | _O_APPEND (일반적으로 _O_WRONLY | _O_CREAT | _O_APPEND )_O_WRONLY | _O_APPEND (usually _O_WRONLY | _O_CREAT | _O_APPEND)
a+ _O_RDWR | _O_APPEND (일반적으로 _O_RDWR | _O_APPEND | _O_CREAT )_O_RDWR | _O_APPEND (usually _O_RDWR | _O_APPEND | _O_CREAT)
R _O_RDONLY
r+ _O_RDWR
w _O_WRONLY (일반적으로 _O_WRONLY | _O_CREAT | _O_TRUNC)_O_WRONLY (usually _O_WRONLY | _O_CREAT | _O_TRUNC)
w+ _O_RDWR (일반적으로 _O_RDWR | _O_CREAT | _O_TRUNC)_O_RDWR (usually _O_RDWR | _O_CREAT | _O_TRUNC)
b _O_BINARY
t _O_TEXT
c 없음None
n 없음None
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 파일을 사용할 수 있습니다.If you are using rb mode, memory mapped Win32 files might also be an option if you don't need to port your code, you expect to read much of the file, or you don't care about network performance.

요구 사항Requirements

기능Function 필수 헤더Required header
fopen_s <stdio.h>
_wfopen_s <stdio.h> 또는 <wchar.h><stdio.h> or <wchar.h>

호환성에 대한 자세한 내용은 Compatibility을 참조하세요.For additional compatibility information, see Compatibility.

라이브러리Libraries

모든 버전의 C 런타임 라이브러리입니다.All versions of the C run-time libraries.

c, n 및 옵션은 t mode 및에 대 한 Microsoft fopen_s 확장 _fdopen 이며 ANSI 이식성이 필요한 경우에는 사용할 수 없습니다.The c, n, and t mode options are Microsoft extensions for fopen_s and _fdopen and shouldn't be used where ANSI portability is desired.

예제Example

// 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+" );
   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

참조See also

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