Что является эквивалентом стандартной библиотеки C ++ для mkstemp? - PullRequest
8 голосов
/ 15 октября 2011

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

Ответы [ 3 ]

5 голосов
/ 15 октября 2011

Там нет ни одного. Обратите внимание, что 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;
3 голосов
/ 15 октября 2011

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

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

3 голосов
/ 15 октября 2011

Нет портативного 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()
...