freopen, freopen_s
cppreference.net에서
| 헤더 <stdio.h>
|
||
FILE* freopen( const char* filename, const char* mode,
FILE* stream );
|
에 정의됨 (1) | (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가 널 포인터가 아니면 filename이 지정하는 파일을 mode을 사용하여 fopen인 것처럼 열려고 시도하고, 그 파일을 stream가 가리키는 파일 스트림에 연결합니다. filename가 널 포인터이면, 함수는 이미 stream와 연결된 파일을 다시 열려고 시도합니다(이 경우 허용되는 모드 변경은 구현 정의입니다).2) (1)과 동일하지만,
mode가 fopen_s에서와 같이 처리되고, 파일 스트림에 대한 포인터가 newstreamptr에 기록되며, 다음 오류들이 런타임에 감지되어 현재 설치된 제약 처리기 함수를 호출한다는 점이 다릅니다:
newstreamptr가 널 포인터임stream가 널 포인터임mode가 널 포인터임
모든 경계 검사 함수와 마찬가지로,
freopen_s는 구현에 의해 __STDC_LIB_EXT1__가 정의되고 사용자가 __STDC_WANT_LIB_EXT1__를 1 정수 상수로 정의한 후 <stdio.h>를 포함하는 경우에만 사용 가능함이 보장됩니다.매개변수
| 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의 값의 복사본, 실패 시 널 포인터.2) 성공 시 0 (그리고
stream의 값의 복사본이 *newstreamptr에 기록됨), 오류 시 0이 아님 (그리고 *newstreamptr에 널 포인터가 기록됨, 단 newstreamptr 자체가 널 포인터인 경우는 제외).참고
freopen는 스트림이 I/O 연산이나 fwide에 의해 설정된 후에, 스트림의 좁은/넓은 방향을 변경할 수 있는 유일한 방법입니다.
Microsoft CRT 버전의 freopen는 filename이 널 포인터일 때 모드 변경을 지원하지 않으며, 이를 오류로 처리합니다 (문서 참조). 가능한 해결 방법은 비표준 함수 _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
참조
- C23 표준 (ISO/IEC 9899:2024):
- 7.21.5.4 freopen 함수 (p: TBD)
- K.3.5.2.2 freopen_s 함수 (p: TBD)
- 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 함수
참고 항목
|
(C11)
|
파일을 열기
(함수) |
|
파일을 닫기
(함수) |
|
|
C++ documentation
for
freopen
|
|