다음을 통해 공유


fopen, _wfopen

파일을 엽니다. 더 많은 매개 변수 유효성 검사 및 반환 오류 코드를 수행하는 이러한 함수의 보다 안전한 버전을 사용할 수 있습니다. 를 참조하세요fopen_s. _wfopen_s

구문

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

매개 변수

filename
파일 이름입니다.

mode
사용할 수 있는 액세스 종류입니다.

반환 값

각 함수는 열린 파일에 대한 포인터를 반환합니다. null 포인터 값은 오류를 나타냅니다. 문자열이거나 mode 빈 문자열인 경우 filename 이러한 함수는 NULL 매개 변수 유효성 검사에 설명된 잘못된 매개 변수 처리기를 트리거합니다. 계속해서 실행하도록 허용된 경우, 이러한 함수는 NULL를 반환하고 errnoEINVAL로 설정합니다.

자세한 내용은 다음을 참조하세요.errno, _doserrno, _sys_errlist_sys_nerr.

설명

함수에서 fopen 지정 filename한 파일을 엽니다. 기본적으로 좁은 filename 문자열은 ANSI 코드 페이지(CP_ACP)를 사용하여 해석됩니다. Windows Desktop 애플리케이션에서는 함수를 사용하여 SetFileApisToOEM OEM 코드 페이지(CP_OEMCP)로 변경할 수 있습니다. 함수를 AreFileApisANSI 사용하여 ANSI 또는 시스템 기본 OEM 코드 페이지를 사용하여 해석되는지 여부를 filename 확인할 수 있습니다. _wfopen 는 와이드 문자 버전입니다 fopen. 인수는 _wfopen 와이드 문자열입니다. 그렇지 않으면 _wfopenfopen 은 동일하게 작동합니다. 그냥 사용하면 _wfopen 파일 스트림에 사용되는 코딩된 문자 집합에 영향을 주지 않습니다.

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

파일에 대해 다른 작업을 수행하기 전에 항상 반환 값을 확인하여 포인터가 NULL인지 확인합니다. 오류가 발생하면 전역 변수 errno 가 설정되며 특정 오류 정보를 가져오는 데 사용될 수 있습니다. 자세한 내용은 다음을 참조하세요.errno, _doserrno, _sys_errlist_sys_nerr.

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

유니코드 지원

fopen 은 유니코드 파일 스트림을 지원합니다. 유니코드 파일을 열려면 다음과 같이 ccs=encoding 에 원하는 인코딩을 지정하는 fopen플래그를 전달합니다.

FILE *fp = fopen("newfile.txt", "rt+, ccs=UTF-8");

인코딩에 허용되는 ccs 값은 UNICODE, UTF-8UTF-16LE.

파일을 유니코드 모드에서 열면 입력 함수는 연 파일에서 읽은 데이터를 wchar_t형식으로 저장되는 UTF-16 데이터로 변환합니다. 유니코드 모드에서 연 파일에 쓰는 함수는 UTF-16 데이터가 포함된 버퍼가 wchar_t형식으로 저장되는 것으로 예상합니다. 파일이 UTF-8로 인코딩된 경우 UTF-16 데이터는 기록될 때 UTF-8로 변환됩니다. 파일의 UTF-8로 인코딩된 콘텐츠는 읽을 때 UTF-16으로 변환됩니다. 유니코드 모드에서 홀수 바이트를 읽거나 쓰려고 하면 매개 변수 유효성 검사 오류가 발생합니다. 프로그램에 UTF-8로 저장된 데이터를 읽거나 쓰려는 경우 유니코드 모드 대신 텍스트 또는 이진 파일 모드를 사용합니다. 필요한 인코딩 번역을 담당합니다.

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

참고 항목

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

다음 표에서는 파일에서 ccs 및 BOM에 지정된 다양한 fopen 에 사용되는 모드에 대해 간단히 설명합니다.

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이 파일에 자동으로 기록됩니다.

일부 encodingfopena, ccs=encoding 경우 mode 먼저 읽기 및 쓰기 액세스 권한을 모두 사용하여 파일을 열려고 시도합니다. 이 작업이 성공하면 함수는 BOM을 읽어 파일에 대한 인코딩을 확인합니다. 실패하면 함수는 파일에 대한 기본 인코딩을 사용합니다. 두 경우 fopen 모두 쓰기 전용 액세스를 사용하여 파일을 다시 엽니다. (이 동작은 모드가 "a" 아닌 모드에 "a+" 만 적용됩니다.)

일반 텍스트 루틴 매핑

TCHAR.H 루틴 _UNICODE_MBCS 정의되지 않음 정의된 _MBCS 정의된 _UNICODE
_tfopen fopen fopen _wfopen

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

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

"a" 또는 "a+" 액세스 형식을 사용하여 파일을 연 경우 모든 쓰기 작업은 파일의 끝에서 수행됩니다. fseek 또는 rewind를 사용하여 파일 포인터의 위치를 변경할 수 있지만, 파일 포인터는 쓰기 작업을 수행하기 전에 항상 파일 끝으로 다시 이동합니다. 따라서 기존 데이터를 덮어쓸 수 없습니다.

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

"r+", "w+"또는 "a+" 액세스 형식을 지정한 경우 읽기와 쓰기를 모두 사용할 수 있습니다. 즉, 파일이 "업데이트"용으로 열립니다. 하지만 읽기에서 쓰기로 전환할 경우 입력 작업 시 EOF 표식이 필요합니다. EOF가 없는 경우 파일 위치 지정 함수에 대한 중간 호출을 사용해야 합니다. 파일 위치 지정 함수는 fsetpos, fseekrewind입니다. 쓰기에서 읽기로 전환할 경우 사이에 fflush 또는 파일 위치 지정 함수를 호출해야 합니다.

이전 값 이외에 다음 문자를 mode 에 추가하여 줄 바꿈 문자에 대한 변환 모드를 지정할 수 있습니다.

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

텍스트 모드에서 CTRL+Z 는 입력에서 EOF 문자로 해석됩니다. 읽기"a+"fopen/쓰기를 위해 열려 있는 파일에서 파일의 끝에 있는+CTRL Z를 확인하고 가능한 경우 제거합니다. Z로+CTRL 끝나는 파일 내에서 사용하고 fseek ftell 이동하면 파일 끝부분에 잘못 동작할 수 fseek 있으므로 제거됩니다.

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

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

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

다음 옵션을 추가하여 더 많은 동작을 mode 지정할 수 있습니다.

mode 한정자 동작
x 이미 있는 경우 filename 함수가 강제로 실패합니다. "w" 또는 "w+" 지정자와 함께만 사용할 수 있습니다.
c filename 또는 fflush 을 호출하면 파일 버퍼의 내용이 디스크에 직접 기록되도록 연결된 _flushall 에 대한 커밋 플래그를 사용합니다.
n 연결된 filename "no-commit"에 대한 커밋 플래그를 다시 설정합니다. 이 플래그는 기본값입니다. 또한 프로그램을 COMMODE.OBJ와 연결할 경우 전역 커밋 플래그를 재정의합니다. COMMODE와 프로그램을 명시적으로 연결하지 않는 한 전역 커밋 플래그 기본값은 "no-commit"입니다. OBJ(링크 옵션 참조).
N 자식 프로세스에서 파일을 상속하지 않도록 지정합니다.
S 캐싱이 디스크에서 순차적 액세스를 위해 최적화되며 이에 제한되지 않습니다.
R 캐싱이 디스크에서 임의 액세스를 위해 최적화되며 이에 제한되지 않습니다.
T 메모리 압력이 필요하지 않은 한 디스크에 기록되지 않은 파일을 지정합니다.
D 마지막 파일 포인터를 닫을 때 삭제되는 임시 파일을 지정합니다.
ccs=encoding 이 파일에 사용할 인코딩된 문자 집합(중 하나 UTF-8UTF-16LE또는 UNICODE)을 지정합니다. ANSI 인코딩을 원할 경우 지정되지 않은 상태로 둡니다. 이 플래그는 쉼표(,)로 앞에 오는 플래그에서 구분됩니다. 예: FILE *f = fopen("newfile.txt", "rt+, ccs=UTF-8");

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

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 (번역)
x _O_EXCL
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 파일을 옵션으로 사용할지 여부도 고려할 수 있습니다.

관련 사항 TD:

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

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

요구 사항

함수 필수 헤더
fopen <stdio.h>
_wfopen <stdio.h> 또는 <wchar.h>

_wfopen 는 Microsoft 확장입니다. 호환성에 대한 자세한 내용은 호환성을 참조하세요.

cANSI 이식성이 필요한 경우 , tnS, RTmode D 옵션은 Microsoft 확장 fopen 이며 _fdopen 사용해서는 안 됩니다.

예 1

다음 프로그램은 두 파일을 엽니다. fclose 를 사용하여 첫 번째 파일을 닫고 _fcloseall 을 사용하여 나머지 파일을 모두 닫습니다.

// crt_fopen.c
// compile with: /W3
// 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 );
}
The file 'crt_fopen.c' was opened
The file 'data2' was opened
Number of files closed by _fcloseall: 1

예제 2

다음 프로그램은 텍스트 모드에서 유니코드 인코딩을 포함하는 파일을 만들거나 덮어씁니다(파일이 있는 경우). 그런 다음 파일에 두 문자열을 쓰고 파일을 닫습니다. 출력은 출력 섹션의 데이터를 포함하는 이름이 지정된 _wfopen_test.xml파일입니다.

// crt__wfopen.c
// compile with: /W3
// This program creates a file (or overwrites one if
// it exists), in text mode using Unicode encoding.
// It then writes two strings into the file
// and then closes the file.

#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <wchar.h>

#define BUFFER_SIZE 50

int main(int argc, char** argv)
{
    wchar_t str[BUFFER_SIZE];
    size_t  strSize;
    FILE*   fileHandle;

    // Create an the xml file in text and Unicode encoding mode.
    if ((fileHandle = _wfopen( L"_wfopen_test.xml",L"wt+,ccs=UNICODE")) == NULL) // C4996
    // Note: _wfopen is deprecated; consider using _wfopen_s instead
    {
        wprintf(L"_wfopen failed!\n");
        return(0);
    }

    // Write a string into the file.
    wcscpy_s(str, sizeof(str)/sizeof(wchar_t), L"<xmlTag>\n");
    strSize = wcslen(str);
    if (fwrite(str, sizeof(wchar_t), strSize, fileHandle) != strSize)
    {
        wprintf(L"fwrite failed!\n");
    }

    // Write a string into the file.
    wcscpy_s(str, sizeof(str)/sizeof(wchar_t), L"</xmlTag>");
    strSize = wcslen(str);
    if (fwrite(str, sizeof(wchar_t), strSize, fileHandle) != strSize)
    {
        wprintf(L"fwrite failed!\n");
    }

    // Close the file.
    if (fclose(fileHandle))
    {
        wprintf(L"fclose failed!\n");
    }
    return 0;
}

참고 항목

스트림 I/O
멀티바이트 문자 시퀀스 해석
fclose, _fcloseall
_fdopen, _wfdopen
ferror
_fileno
freopen, _wfreopen
_open, _wopen
_setmode
_sopen, _wsopen