freopen(3) 문서를 참조하십시오. 테스트하고 그 결과를 사용해야합니다
freopen()
함수 이름 문자열 가 path
가 가리키는 및 스트림이 함께 스트림 가리키는 연관 파일을 엽니을. 원본 스트림 (있는 경우)이 닫힙니다. 성공적으로 완료 fopen()
시
, fdopen()
과 FILE 포인터를 반환 freopen()
:
반환 값에 대한
. 그렇지 않으면, NULL
이 반환되고 errno
은 으로 설정되어 오류를 나타냅니다.
그래서 당신은 코딩 할 필요가있다 (Linux 또는 일부 POSIX 시스템의 경우) 적어도
void write_to(int subtask, int tc){
string output =
string("testcases/subtask-") + to_string(subtask)
+ "-tc-" + to_string(tc);
FILE*outf = freopen(output.c_str(), "w", stdout);
if (!outf) {
perror(output.c_str());
char pwdbuf[128];
memset (pwdbuf, 0, sizeof(pwdbuf));
getcwd(pwdbuf, sizeof(pwdbuf)-1);
fprintf(stderr, "failure in %s\n", pwdbuf);
exit(EXIT_FAILURE);
}
}
(위의 코드 문제를 해결하지만,하지 않습니다 출력 오류에 대한 의미있는 오류 메시지 것이다 ; 아마도 적절한 현재 디렉토리에 코드) 나는 또한 fflush(stdout)
또는 fflush(NULL)
으로 main
에 for
루프를 종료하는 것이 좋습니다
실행되지 않습니다. Linux 또는 POSIX에, 대신 파일 기술자 수준에서 작동 할 수있는 경우
는 (그래서 리디렉션 코드) 및 (
dup2
에 두 번째 인수로
STDOUT_FILENO
사용)
open(2) &
dup(2)를 사용합니다.
는 testcases
경우의 디렉토리 당신의 $HOME
(쉘에 의해 확장으로 즉, ~/testcases/
입니다) 당신이 경로 스펙이 아닌 디렉토리에 실행 파일 실행의 현재 디렉토리를 기준으로
string output =
string (getenv("HOME")) + "/"
+ string("testcases/subtask-") + to_string(subtask)
+ "-tc-" + to_string(tc);
할 것 안으로있다. –
'output' 디렉토리는 이미 존재합니까? –
@MichaelWalz 예 이미 존재합니다 –