freopen(3)のドキュメントを読んでください。その結果をテストして使用する必要があります。
このfreopen()
関数は、が指す文字列の名前を持つファイルを開き、path
stream が指すストリームをそれに関連付けます。 元のストリーム (存在する場合) は閉じられます。
その戻り値について:
正常に完了fopen()
すると、FILE ポインター fdopen()
を返します。それ以外の場合はが返され、エラーを示すように設定されます。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);
}
}
(上記のコードは問題を解決しませんが、エラー時に意味のあるエラー メッセージを出力します。おそらく、適切な現在のディレクトリでコードを実行していません)
または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);