mkstemp()
関数はテンプレートから一意の一時ファイル名を生成し、ファイルを作成して開き、そのファイルのオープンファイル記述子を返します。テンプレートの最後の6文字は "XXXXXX"でなければならず、これらはファイル名を一意にする文字列に置き換えられます。変更されるので、テンプレートは文字列定数であってはいけませんが、文字配列として宣言する必要があります。mkstempから生成されたファイル名を使用
テンプレートをファイル名を一意にする文字列に置き換えた後、後で使用するために文字列を保存します。これは私の頭を包み込むことができない奇妙な問題に直面しているところです。私は端末に正しいファイル名を印刷し、ファイルエクスプローラのファイルを見て正しい内容を見るために開きますが、popen()
で実行するコマンドの一部として文字列を含めると、空のファイルへのポインタが得られます。しかし、テンポラリーファイルの名前を自分のコードにハードコードして再実行すると、私は期待している正しい結果を得ます。私は見落としているか何かがありますか?ここでは、コードスニペットである:mkstemp
のマンページから
char tmpname[] = "tmp.XXXXXX";
FILE *fpt = fdopen(mkstemp(tmpname), "w");
string saved_tmpname(tmpname);
// blah
// write to file
// blah blah
const string command = "mycommand " + saved_tmpname;
cout << command << endl; // prints correctly
FILE *fpipe = popen(command.c_str(), "r");
if (fpipe == NULL) {
perror(command.c_str());
}
char buff[4096];
while (fgets(buff, 4096, fpipe)) {
// we don't get here!
}