View
예전 부터 백준 문제를 풀 때 문제의 입력 값을 직접 복사해서 치는 것이 너무 귀찮았다. 이번에 다시 알고리즘 공부를 시작하면서, 입력 파일 및 출력 파일을 이용하여서 문제를 푸는 방법을 찾아보았다.
1. OS의 Redirect 기능 이용
이 기능이 프로그램 코드를 수정하지 않고 하는 방법 중에서는 가장 쉬운 방법이라고 생각한다.
프로그램을 실행할 때
./program <input.txt >output.txt
와 같이 입력하면, 'input.txt'의 파일의 내용을 stdin의 입력으로 받고 'output.txt'의 파일에 stdout의 출력을 적는다.
만약에 프로그램의 출력은 터미널에서 보고 싶다면,
./program <input.txt
과 같이 사용 할 수 있다. < 기호는 다음에 오는 argument의 파일을 프로그램의 입력으로 준다는 뜻이고, > 기호는 다음에 오는 argument에 파일의 출력을 적겠다는 뜻이다. 당연하게도 ./folder/input.txt와 같은 상대 경로를 입력으로 줄 수 도 있다.
참고: https://www.acmicpc.net/board/view/51324
2. Freopen 코드 이용
위의 코드가 더 편해보이지만, 프로그램을 직접 쳐서 실행할 때는 더 귀찮기도 하다. 특히 Visual Studio Code를 이용해서 코드를 작성하고, 내장 extension인 code runnder를 이용하여 컴파일 한 후 직접 실행할 때는 위와 같은 Redirect 기능이 불편할 때도 있었다. 그래서 아래의 방법을 자주 사용한다.
#define LOCAL
#include<iostream>
using namespace std;
int main(){
#ifdef LOCAL
freopen("data/data.txt", "r", stdin);
// freopen("data/input.txt", "r", stdin);
freopen("data/output.txt", "w", stdout);
#endif
// code code
}
프로그램이 있는 폴더 안에 data 폴더를 만들고 그 안에 'data.txt'와 'input.txt' 파일을 만든다. data.txt 파일은 예제의 입력을 복사해서 넣어놓고, input.txt 파일에는 직접 테스트할 입력을 작성한다. 그 결과는 'output.txt' 파일에 저장이 된다.
그리고 제출할 때는 가장 윗줄에 '#define LOCAL'을 지우고 제출하면 ifdef 구문을 전처리기에서 알아서 없애니까, 입출력을 정상적으로 받는다.
ps. 나의 Local 환경에서 freclose 구문도 파일이 끝날 때 작성했었는데, 그렇게 하면 입출력이 제대로 되지 않았다. 왜 그런지는 몰라서 그냥 file stream을 열어놓은 채로 프로그램을 종료시키고 있다.
'Programming Language > C & Cpp' 카테고리의 다른 글
[Cpp/C++] 백준 14499: 주사위 굴리기 (0) | 2022.07.16 |
---|