Hello

: )

2016년 4월 7일 목요일

freopen() 사용으로 입력 출력 간편하게 처리하기

* Updated: 아래 내용은 Visual Studio 아닌 경우 (괜찮은 IDE 가 없는 Android 라든지..) 에 임시 방편으로 할 만한 내용이고, Visual Studio 같이 좋은 IDE 환경에서는 debug setting 을 이용하는 방식을 쓰면 됩니다
참고 1) http://gooddaytocode.blogspot.kr/2016/06/visual-studio.html
참고 2) http://gooddaytocode.blogspot.kr/2017/03/google-code-jam-visual-studio.html




Online Judge 사이트 문제를 보면 표준입출력으로
입력을 처리하고, 결과를 출력하면 성공이나 실패 여부를 알려주게 됩니다.

간단히 해결 가능한 문제라면 Online editor 에서 바로 작성해서 제출해도 되겠지만
어느 정도 난이도가 있는 경우에는 PC 개발환경에서 시험을 해보고 만족할 만한 상태가 되면 제출을 하게 됩니다.

PC 에서 Test 할 때에 입력이 단순 하다면
(예를 들어, N 을 입력 받아 N 을 출력하라.)

1:  #include <stdio.h>  
2:    
3:  int main(void) {  
4:    int N;  
5:    scanf("%d", &N);  
6:    printf("%d", N);  
7:    return 0;  
8:  }  

Console 에 매번 입력할 만한 하지만, 복잡한 케이스라면 데이터를 매번 입력하는 것은 가급적 하지 않는 것이 정신건강에 좋을 듯 하네요.

freopen() 이라는 함수가 이런 수작업을 없앨 수 있는 방법 중에 하나인데, 아래와 같이 사용하게 되면 Console 창에 결과가 바로 출력이 됩니다.

주의: 파일 경로가 없기 때문에 Source code 파일과 동일한 경로에 존재해야 합니다.

1:  #include <stdio.h>  
2:    
3:  int main(void) {  
4:    int N;  
5:    
6:    freopen("input.txt", "r", stdin);  
7:    
8:    scanf("%d", &N);  
9:    printf("%d", N);  
10:    return 0;  
11:  }  

간단하게 input.txt 에 있는 내용을 read 해서 stdin 으로 전달해 주는 것이라고 생각하면 됩니다. 역으로, console 확인하는게 귀찮으면 아래와 같이 해주면 됩니다.
1:  #include <stdio.h>  
2:    
3:  int main(void) {  
4:    int N;  
5:    
6:    freopen("input.txt", "r", stdin);  
7:    freopen("output.txt", "w", stdout);  
8:    
9:    scanf("%d", &N);  
10:    printf("%d", N);  
11:    return 0;  
12:  }  

그리고, 아래와 같이 개발도구 (Visual Studio 2015 Desktop) 에서 볼 수 있도록 추가해줍니다.


아래와 같이 소스가 있는 Console.cpp 와 같은 폴더에 존재하면 간편합니다.




최종적으로는, Online Judge 사이트에 코드 제출시에는 해당 code 는 삭제가 되어야 합니다. 저는 보통 Console project 하나 만들어서 재활용하는데, 아래와 같이 처리하고 4 번 라인부터 제출하고 있습니다.

1:  #include "stdafx.h"  
2:  #define MY_LOCAL_TEST  
3:    
4:  #include <stdio.h>  
5:    
6:  int main(void) {  
7:    int N;  
8:    
9:  #ifdef MY_LOCAL_TEST  
10:    freopen("input.txt", "r", stdin);  
11:    freopen("output.txt", "w", stdout);  
12:  #endif  
13:    
14:    scanf("%d", &N);  
15:    printf("%d", N);  
16:  #ifdef MY_LOCAL_TEST 
17:    fclose(stdin); 
18:    fclose(stdout);
19:  #endif 
20:    return 0;  
21:  }  
22:    

추가1: freopen 에 대한 MSDN 내용

https://msdn.microsoft.com/ko-kr/library/wk2h68td.aspx


freopen() 에서 사용한 stdin, stdout 리소스에 대해서 fclose() 를 호출하는 것이 정석이고, stdin 만 사용하면 fclose 까지 사용하지 않아도 크게 문제되는 것은 없는 듯..


2016.12.21 추가 * Visual Studio 사용자면 그냥 아래 내용 참고
http://gooddaytocode.blogspot.kr/2016/06/visual-studio.html

* Compile 분기를 위한 define 은 ONLINE_JUDGE 를 쓰자.. 아래 내용 참고
http://gooddaytocode.blogspot.kr/search/label/%5B028%5D%20%EC%B1%84%EC%A0%90%20%EB%8F%84%EC%9B%80%EB%A7%90%EC%9D%84%20%EC%9D%BD%EC%96%B4%EB%B3%B4%EC%9E%90

댓글 3개: