vy3*_*y32 9 c++ mkstemp libstdc++
我正在转换使用POSIX临时文件FILE到C++标准库iostreams的程序.什么是mkstemp的正确替代品?
空无一人.请注意,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;
Run Code Online (Sandbox Code Playgroud)
如果你想要一个可移植的 C++ 解决方案,你应该在boost::filesystem 中使用 unique_path :
unique_path 函数生成适合创建临时文件(包括目录)的路径名。该名称基于使用百分号字符指定替换为随机十六进制数字的模型。[注意:生成的路径名中的随机性越多,先前存在或被猜测的可能性就越小。模型中的每个替换十六进制数字都会增加四位随机性。因此,默认模型提供 64 位随机性。这对于大多数应用程序来说已经足够了
没有可移植的 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()
Run Code Online (Sandbox Code Playgroud)