使用freopen写入子目录

时间:2016-12-08 13:24:43

标签: c freopen

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

有没有人有解决方案?

1 个答案:

答案 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);
   }
}

(上面的代码不会解决您的问题,但会在出错时输出有意义的错误消息;可能您没有在相应的当前目录中运行代码)

我还建议您使用formain结束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);