freopen(3)のドキュメントを読んでください。その結果をテストして使用する必要があります。
このfreopen()関数は、が指す文字列の名前を持つファイルを開き、pathstream が指すストリームをそれに関連付けます。 元のストリーム (存在する場合) は閉じられます。
その戻り値について:
正常に完了fopen()すると、FILE ポインター fdopen()を返します。それ以外の場合はが返され、エラーを示すように設定されます。freopen()NULLerrno
したがって、少なくともコーディングする必要があります(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);
}
}
(上記のコードは問題を解決しませんが、エラー時に意味のあるエラー メッセージを出力します。おそらく、適切な現在のディレクトリでコードを実行していません)
またはforでループをmain終了することもお勧めします。fflush(stdout)fflush(NULL)
Linux または POSIX の場合は、代わりにファイル記述子レベルで作業し (リダイレクトをコーディングします)、open(2) & dup(2) (をSTDOUT_FILENOの 2 番目の引数として使用) を使用できdup2ます。
あなたの(つまり、あなたのシェルによって展開されtestcasesた)ディレクトリである場合、あなたは望むでしょう$HOME~/testcases/
string output =
string (getenv("HOME")) + "/"
+ string("testcases/subtask-") + to_string(subtask)
+ "-tc-" + to_string(tc);