我正在转换使用POSIX FILE
中的临时文件到C ++标准库iostream的程序。什么是mkstemp的正确替代方案?
答案 0 :(得分:5)
没有。请注意,mkstemp
不是C(至少是C99)或C ++标准的一部分 - 它是POSIX的补充。 C ++在C库部分只有tmpfile
和tmpnam
。
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;
答案 1 :(得分: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()
答案 2 :(得分:3)
如果您需要可移植的C ++解决方案,则应在boost::filesystem中使用unique_path:
unique_path函数生成适合创建的路径名 临时文件,包括目录。该名称基于模型 使用百分号字符指定替换为 随机十六进制数字。 [注意:随机性中的位数越多 生成的路径名称,先前存在或存在的可能性较小 猜到了。模型中的每个替换十六进制数字都会增加四位数 随机性。因此默认模型提供64位 随机性。这对于大多数应用来说已经足够了