Функция mkstemp()
генерирует уникальное временное имя файла из шаблона, создает и открывает файл и возвращает дескриптор открытого файла для файла.Последние шесть символов шаблона должны быть «XXXXXX», и они заменяются строкой, которая делает имя файла уникальным.Поскольку он будет изменен, шаблон не должен быть строковой константой, а должен быть объявлен как массив символов.
После замены шаблона строкой, которая делает имя файла уникальным, я сохраняю строку для последующего использования.Здесь я сталкиваюсь со странной проблемой, которую я не могу обернуть вокруг себя.Я могу напечатать правильное имя файла на моем терминале, посмотреть файл в проводнике и открыть его, чтобы увидеть правильное содержимое, но когда я включаю строку как часть команды для выполнения с popen()
, я получаю указатель на пустойфайл.Однако, когда я жестко запрограммировал имена временных файлов обратно в свой код и снова запустил, я получил правильный результат, которого я ожидал.Есть что-то, что я пропускаю или пропускаю?Вот фрагмент кода:
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!
}