freopen() — 열린 파일 경로 재지정
형식
#include <stdio.h>
FILE *freopen(const char *filename, const char *mode, FILE *stream);
언어 레벨
ANSI
스레드세이프
예
설명
freopen() 함수는 현재 stream과 연관된 파일을 닫고, filename에서 지정된 파일에 stream을 재지정합니다. freopen() 함수는 지정된 mode로 stream과 연관된 새 파일을 열며, 파일에 대해 요청된 액세스의 유형을 지정하는 문자 스트링입니다. freopen() 함수를 사용하여 표준 스트림 파일 stdin, stdout 및 stderr을 지정한 파일로 경로 재지정할 수도 있습니다.
데이터베이스 파일의 경우 filename이 빈 스트링이면, freopen() 함수는 새 파일 또는 장치에 재지정하지 않고 닫고 새 열린 모드에 대한 스트림을 다시 엽니다. 파일 이름이 지정되지 않은 freopen() 함수를 사용하여 스트림의 경로를 재지정하지 않고 표준 스트림의 모드를 텍스트에서 2진으로 변경할 수 있습니다. 예를 들어 다음과 같습니다.
fp = freopen("", "rb", stdin);
동일 방식을 사용하여 모드를 2진에서 텍스트로 다시 변경할 수 있습니다.
SYSIFCOPT(*IFSIO)로 작성된 모듈에서 빈 스트링으로 filename과 함께 freopen() 함수를 사용할 수 없습니다.
리턴값
freopen() 함수는 포인터를 최근에 열린 스트림으로 리턴합니다. 오류가 발생하면, freopen() 함수는 원본 파일을 닫고, NULL 포인터 값을 리턴합니다.
errno의 값은 다음으로 설정될 수 있습니다.
- 값
- 의미
- EBADF
- 파일 포인터 또는 설명자는 유효하지 않습니다.
- EBADMODE
- 지정되는 파일 모드는 유효하지 않습니다.
- EBADNAME
- 지정되는 파일명은 유효하지 않습니다.
- ENOENT
- 파일이나 라이브러리가 아닙니다.
- ENOTOPEN
- 파일이 열려 있지 않습니다.
- EIOERROR
- 회복 불가능한 I/O 오류가 발생했습니다.
- EIORECERR
- 회복 가능한 I/O 오류가 발생했습니다.
예
이 예는 stream1 데이터 스트림을 닫고, 해당 스트림 포인터를 재지정합니다. stream1 및 stream2는 동일한 값을 가지지만
반드시 stream과 같은 값을 가지고 있지는 않습니다.
#include <stdio.h>
#define MAX_LEN 100
int main(void)
{
FILE *stream, *stream1, *stream2;
char line[MAX_LEN], *result;
int i;
stream = fopen("mylib/myfile","r");
if ((result = fgets(line,MAX_LEN,stream)) != NULL)
printf("The string is %s\n", result);
/* Change all spaces in the line to '*'. */
for (i=0; i<=sizeof(line); i++)
if (line[i] == ' ')
line[i] = '*';
stream1 = stream;
stream2 = freopen("", "w+", stream1);
fputs( line, stream2 );
fclose( stream2);
}