아무래도 C/C++에서 파일 입출력을 사용했던 게 정보올림피아드 대회 문제 풀 때가 마지막이었던 것 같다. 그 당시에는 C++의 fstream이 더 편해서 그걸 이용했고, C를 사용할 때만 반 강제적으로 C의 fopen을 사용하곤 했는데 freopen을 알고 나니까 freopen과 fopen, 덤으로 fdopen에 대해서 조금 더 알고 싶어졌다.
freopen은 온라인 저지를 이용한 알고리즘 문제를 풀 때 많이 사용한다. 입력할 데이터가 많으면, 하나하나 치는 것이 다 일이기 때문. 이 때는 입력 데이터를 파일로 만들어서 freopen으로 스트림을 변경시켜주기만 하면 scanf나 printf를 변경하지 않고도 파일입출력을 사용할 수 있어 편리하다.
(물론 어지간한 크기의 데이터가 아니면 직접 치는 편이다. 실수로 입력된 값이 반례가 되는 경우가 있기 때문..)
fopen
FILE* fopen(const char* filename, const char* mode);
freopen
FILE* freopen(const char* filename, const char* mode, FILE* stream);
fdopen
FILE* fdopen(int flides, const char* mode);
fopen, freopen 두 함수 형태가 유사해보이지만 freopen에는 stream이 추가되어 있는데, 지정한 스트림(stream)을 이는 현재 열 파일(filename)의 스트림으로 변경시키는 역할을 한다. 표준 입력, 표준 출력 등을 변경시키고 싶다면 stdout, stdin을 stream에 넣으면 된다.
정리하자면 fopen을 쓰면, 파일을 엶과 동시에 스트림 변경이 불가능하기 때문에, fscanf, fprintf나 fputs, fgets 등의 함수를 사용해야 하고, freopen은 스트림을 변경할 수 있어서 scanf, printf, puts, gets 등을 사용할 수 있다는 것이다.
freopen을 사용해서 표준 입출력(stdin, stdout)의 스트림을 특정 파일의 스트림으로 변경했다가 다시 표준 입출력으로 돌리고 싶을 때는 fdopen을 사용하여 복구시킬 수 있다.
stdin=fdopen(1,"r"), stdout=fdopen(1,"w")로 표준 입출력을 다시 살려낼 수도 있고, fdopen의 파일 포인터 값을 fscanf, fprintf에서 사용하는 방법도 있다.
'Programming Language > C,C++' 카테고리의 다른 글
비트맵(bmp) 구조체 구조 (0) | 2018.06.16 |
---|---|
함수 오버로딩과 디폴트 매개변수가 만드는 모호성 (0) | 2018.06.14 |
C, C++] 이중 포인터를 이용해 2차원 배열 사용하기 (2) | 2018.05.16 |
C, C++] stdafx.h와 C2065(선언되지 않은 식별자입니다.) (0) | 2018.05.15 |
C, C++] 조건부 컴파일 (0) | 2018.05.08 |