Что эквивалентно стандартной библиотеке C++ для mkstemp?

Я перехожу из программы, которая использует временные файлы из POSIX FILE в C++ стандартная библиотека iostreams. Какова правильная альтернатива mkstemp?

3 ответа

Решение

Нет портативного C++ способа сделать это. Вам необходимо создать файл (это делается автоматически при открытии файла для записи с использованием ofstream) а потом remove это снова, когда вы закончите с файлом (с помощью функции удаления библиотеки C). Но вы можете использовать tmpnam сгенерировать имя для файла:

#include <fstream>
#include <cstdio>

char filename[L_tmpnam];
std::tmpnam(filename);
std::fstream file(filename);
...
std::remove(filename);   //after closing, of course, either by destruction of file or by calling file.close()

Здесь ничего нет. Обратите внимание, что mkstemp не является частью ни стандарта C (по крайней мере, C99), ни стандарта C++ - это дополнение POSIX. C++ имеет только tmpfile а также tmpnam в части библиотеки C.

Boost.IOStreams, однако, обеспечивает file_descriptor класс устройства, который может быть использован для создания потока, работающего на mkstemp возвращается.

Если я правильно помню, это должно выглядеть так:

namespace io = boost::iostreams;

int fd = mkstemp("foo");
if (fd == -1) throw something;

io::file_descriptor device(fd);
io::stream<io::file_descriptor> stream(device);

stream << 42;

Если вы хотите портативное решение C++, вы должны использовать unique_path в boost:: filesystem:

Функция unique_path генерирует имя пути, подходящее для создания временных файлов, включая каталоги. Имя основано на модели, которая использует знак процента для указания замены случайной шестнадцатеричной цифрой. [Примечание: чем больше битов случайности в сгенерированном имени пути, тем меньше вероятность предыдущего существования или угадывания. Каждая замещающая шестнадцатеричная цифра в модели добавляет четыре бита случайности. Таким образом, модель по умолчанию обеспечивает 64 бита случайности. Этого достаточно для большинства приложений

Другие вопросы по тегам