我正在尝试使用freopen写出子目录中的文件:
freopen("output/output-1.txt", "w", stdout);
我已经尝试将其更改为输出到当前目录并且它可以正常工作。当目标输出文件位于子目录中时,它会终止而不会出错;但是没有创建文件。创建所需目录不能解决问题。
void write_to(int subtask, int tc){
string output = string("testcases/subtask-") + to_string(subtask) + "-tc-" + to_string(tc);
freopen(output.c_str(), "w", stdout);
}
int main(){
for(int i = 1; i <= 25; i++){
write_to(1, i);
// rest of code to generate and cout test cases
}
}
有没有人有解决方案?
答案 0 :(得分:1)
阅读freopen(3)的文档。您应该测试并使用其结果:
freopen()
函数打开名称为字符串的文件 由path
指向并关联流指向的流 用它。 原始流(如果存在)已关闭。
关于其返回值:
成功完成
fopen()
后,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)&amp; dup(2)(使用STDOUT_FILENO
作为dup2
的第二个参数)。
如果testcases
是$HOME
中的目录(即您的shell展开的~/testcases/
),那么您需要
string output =
string (getenv("HOME")) + "/"
+ string("testcases/subtask-") + to_string(subtask)
+ "-tc-" + to_string(tc);