0

我正在尝试使用 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
    }
}

有人对此有解决方案吗?

4

1 回答 1

1

阅读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);
于 2016-12-08T14:34:09.827 回答