Что эквивалентно стандартной библиотеке 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 бита случайности. Этого достаточно для большинства приложений