阅读freopen(3)的文档。您应该测试并使用它的结果:
该freopen()函数打开文件名是指向的字符串,path并将流指向的流与它相关联。 原始流(如果存在)已关闭。
关于它的返回值:
成功完成后fopen(),fdopen()并freopen()返回一个 FILE 指针。 否则,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);
}
}
(上面的代码不会解决您的问题,但会在错误时输出有意义的错误消息;也许您没有在适当的当前目录中运行您的代码)
我还建议用or结束你的for循环。mainfflush(stdout)fflush(NULL)
如果在 Linux 或 POSIX 上,您可能会改为在文件描述符级别工作(因此编写重定向代码),并使用open(2)和dup(2)(STDOUT_FILENO用作 的第二个参数dup2)。
如果testcases是您的目录$HOME(即,~/testcases/由您的外壳扩展),您会想要
string output =
string (getenv("HOME")) + "/"
+ string("testcases/subtask-") + to_string(subtask)
+ "-tc-" + to_string(tc);