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()関数は、が指す文字列の名前を持つファイルを開き、pathstream が指すストリームをそれに関連付けます。 元のストリーム (存在する場合) は閉じられます。

その戻り値について:

正常に完了fopen()すると、FILE ポインター fdopen()を返します。それ以外の場合はが返され、エラーを示すように設定されます。freopen()NULLerrno

したがって、少なくともコーディングする必要があります(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);
于 2016-12-08T14:34:09.827 に答える