C, freopen


[원문 보기]

설명

freopen함수는 열려있는 stdin, stdout, stderr 스트림을 닫고 파일로 redirect 해주는 함수이다. 스트림이 무조건 닫히기 때문에 freopen에 인자로 넘겨준 스트림은 화면(모니터)에 출력되지 않고 파일에만 쓰인다. 다시 화면(모니터)에 출력하기 위해선 아래 예제와 같이 tty로 redirect 해주면 된다.


함수

FILE *freopen(const char *filename, const char *mode, FILE *stream)

인자

filename : 스트림을 출력할 파일명
mode : 파일 접근모드로 모드 별 설명은 아래와 같다.
modeDescription
"r"읽기 모드로, 파일이 반드시 존재해야하며 없을 경우 에러를 발생한다.

Opens a file for reading. The file must exist.
"w"쓰기 모드로, 파일이 없을 경우 생성한다. 파일이 존재할 경우에는 기존 내용은 삭제되고 새로운 내용을 덮어쓴다.

Creates an empty file for writing. If a file with the same name already exists then its content is erased and the file is considered as a new empty file.
"a"추가 모드로, 파일의 마지막(end of file)에 새로운 내용을 쓴다. 파일이 없을 경우에는 생성한다.

Appends to a file. Writing operations appends data at the end of the file. The file is created if it does not exist.
"r+"읽기, 쓰기 모두 가능한 모드로, 파일이 반드시 존재해야하며 없을 경우 에러를 발생한다.

Opens a file to update both reading and writing. The file must exist.
"w+"읽기, 쓰기 모두 가능한 모드로, 내용이 없는 신규 파일을 생성한다.

Creates an empty file for both reading and writing.
"a+"일기, 추가 모드로 파일을 연다.

Opens a file for reading and appending.

stream: FILE형 포인터로 redirect하기위해 다시 열기(re-open) 하려는 스트림을 나타낸다. stdin, stdout, stderr가 있다.

리턴 값
스트림이 정상적으로 다시 열리면(re-open) 스트림 포인터를, 오류일 경우 널(null) 포인터를 반환한다.

Example
#include 

int main(void)
{
 /* stdout 스트림을 stdoutTest.txt 파일로 redirect 한다. */
 if (freopen("stdoutTest.txt", "w", stdout) == NULL){
  fprintf(stderr, "Error redirecting stdout\n");
 } 

 /* 아래 문장이 파일스트림에 써지게된다. */
 fprintf(stdout, "[fprintf] Stdout stream redirect test.\n");
 printf("[printf] Stdout stream redirect test.\n");

 /* stdout 스트림을 닫는다 */
 fclose(stdout);

 /* stdout 스트림을 다시 화면(모니터)에 출력하기 위해서
 스트림을 redirect 한다.*/
 // linux
 freopen("/dev/tty", "w", stdout);
 
 // windows
 freopen("CON", "w", stdout);//window CON or CON:
 
 return 0;
}