Namespaces
Variants

freopen, freopen_s

From cppreference.net
< c ‎ | io
헤더 파일에 정의됨 <stdio.h>
(1)
FILE * freopen ( const char * filename, const char * mode,
FILE * stream ) ;
(C99 이전)
FILE * freopen ( const char * restrict filename, const char * restrict mode,
FILE * restrict stream ) ;
(C99부터)
errno_t freopen_s ( FILE * restrict * restrict newstreamptr,

const char * restrict filename, const char * restrict mode,

FILE * restrict stream ) ;
(2) (C11부터)
1) 먼저, stream 과 연결된 파일을 닫으려 시도하며(모든 오류는 무시), 그런 다음 filename 이 null이 아닌 경우 mode 를 사용하여 filename 으로 지정된 파일을 fopen 과 같은 방식으로 열려 시도하고, 해당 파일을 stream 이 가리키는 파일 스트림과 연결합니다. filename 이 null 포인터인 경우, 함수는 이미 stream 과 연결된 파일을 다시 열려 시도합니다(이 경우 어떤 mode 변경이 허용되는지는 구현에 따라 정의됩니다).
2) (1) 과 동일하지만, mode fopen_s 에서처럼 처리되며, 파일 스트림에 대한 포인터가 newstreamptr 에 기록되고 런타임에 다음 오류들이 검출되어 현재 설치된 제약 조건 처리기 함수를 호출합니다:
  • newstreamptr 이 널 포인터인 경우
  • stream 이 널 포인터인 경우
  • mode 이 널 포인터인 경우
모든 경계 검사 함수와 마찬가지로, freopen_s 는 구현에서 __STDC_LIB_EXT1__ 가 정의되고 사용자가 <stdio.h> 를 포함하기 전에 __STDC_WANT_LIB_EXT1__ 를 정수 상수 1 으로 정의한 경우에만 사용 가능함이 보장됩니다.

목차

매개변수

filename - 파일 스트림과 연결할 파일 이름
mode - 새로운 파일 접근 모드 를 결정하는 null-terminated 문자열
stream - 수정할 파일 스트림
newstreamptr - 함수가 결과를 저장할 포인터의 포인터 (출력 매개변수)

파일 접근 플래그

파일 접근
모드 문자열
의미 설명 파일이 이미 존재할 때
동작
파일이 존재하지 않을 때
동작
"r" 읽기 파일을 읽기 위해 열기 시작부터 읽기 열기 실패
"w" 쓰기 파일을 쓰기 위해 생성 내용 삭제 새 파일 생성
"a" 추가 파일에 추가하기 끝에 쓰기 새 파일 생성
"r+" 확장 읽기 파일을 읽기/쓰기 위해 열기 시작부터 읽기 오류
"w+" 확장 쓰기 파일을 읽기/쓰기 위해 생성 내용 삭제 새 파일 생성
"a+" 확장 추가 파일을 읽기/쓰기 위해 열기 끝에 쓰기 새 파일 생성
파일 접근 모드 플래그 "b" 를 선택적으로 지정하여 파일을 바이너리 모드로 열 수 있습니다. 이 플래그는 POSIX 시스템에서는 영향을 미치지 않지만, Windows에서는 ' \n ' ' \x1A ' 의 특별한 처리를 비활성화합니다.
추가 파일 접근 모드에서는 파일 위치 표시자의 현재 위치와 관계없이 데이터가 파일의 끝에 기록됩니다.
모드가 위에 나열된 문자열 중 하나가 아닌 경우 동작은 정의되지 않습니다. 일부 구현에서는 추가로 지원되는 모드를 정의합니다 (예: Windows ).
갱신 모드( '+' )에서는 입력과 출력 모두 수행할 수 있지만, 출력 후에는 fflush , fseek , fsetpos 또는 rewind 호출 없이는 입력을 수행할 수 없으며, 입력 후에는 fseek , fsetpos 또는 rewind 호출 없이는 출력을 수행할 수 없습니다. 단, 입력 작업이 파일 끝을 만난 경우는 예외입니다. 갱신 모드에서는 텍스트 모드가 지정된 경우에도 구현이 바이너리 모드를 사용하도록 허용됩니다.
파일 접근 모드 플래그 "x" 를 선택적으로 "w" 또는 "w+" 지정자에 추가할 수 있습니다. 이 플래그는 파일이 존재할 경우 덮어쓰는 대신 함수가 실패하도록 강제합니다. (C11)
fopen_s 또는 freopen_s 를 사용할 때, "w" 또는 "a" 로 생성된 모든 파일에 대한 파일 접근 권한은 다른 사용자의 접근을 방지합니다. 파일 접근 모드 플래그 "u" 를 선택적으로 "w" 또는 "a" 로 시작하는 지정자 앞에 추가하여 기본 fopen 권한을 활성화할 수 있습니다. (C11)

반환값

1) 성공 시 stream 값의 복사본, 실패 시 null 포인터.
2) 성공 시 0을 반환하며 ( stream 값의 복사본이 * newstreamptr 에 기록됨), 오류 시 0이 아닌 값을 반환하며 ( * newstreamptr 에 null 포인터가 기록됨 - 단, newstreamptr 자체가 null 포인터인 경우는 제외).

참고 사항

freopen 는 스트림의 좁은/넓은 방향성이 I/O 연산이나 fwide 에 의해 설정된 후 이를 변경할 수 있는 유일한 방법입니다.

Microsoft CRT 버전의 freopen 함수는 filename 이 null 포인터일 때 어떤 모드 변경도 지원하지 않으며 이를 오류로 처리합니다(관련 문서 참조). 가능한 해결 방법으로는 비표준 함수인 _setmode() 를 사용하는 것이 있습니다.

예제

다음 코드는 stdout 을 파일로 리디렉션합니다.

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    puts("stdout is printed to console");
    if (freopen("redir.txt", "w", stdout) == NULL)
    {
       perror("freopen() failed");
       return EXIT_FAILURE;
    }
    puts("stdout is redirected to a file"); // this is written to redir.txt
    fclose(stdout);
    return EXIT_SUCCESS;
}

출력:

stdout is printed to console

참조문헌

  • C17 표준 (ISO/IEC 9899:2018):
  • 7.21.5.4 freopen 함수 (p: 224-225)
  • K.3.5.2.2 freopen_s 함수 (p: 429-430)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.21.5.4 freopen 함수 (p: 307)
  • K.3.5.2.2 freopen_s 함수 (p: 590)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.19.5.4 freopen 함수 (p: 272-273)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.9.5.4 freopen 함수

참고 항목

파일을 열기
(함수)
파일을 닫기
(함수)