与mkstemp等价的c++标准库是什么?

libstdWhat is the C++ standard library equivalent for mkstemp?

本文关键字:标准 是什么 c++ mkstemp      更新时间:2023-10-16

我正在转换一个使用POSIX FILE临时文件到c++标准库iostreams的程序。mkstemp的正确替代方案是什么?

无。请注意,mkstemp既不是C(至少是C99)的一部分,也不是c++标准的一部分——它是POSIX添加的。c++的C库部分只有tmpfiletmpnam

提振。然而,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++解决方案,应该在boost::filesystem:

中使用unique_path

unique_path函数生成一个适合创建的路径名临时文件,包括目录。这个名字是基于一个模型它使用百分号字符来指定由随机的十六进制数字。[注:更多的随机位在生成的路径名称,先前存在或正在存在的可能性较小猜到了。模型中每替换一个十六进制数字加4一些随机性。因此,默认模型提供64位的随机性。这对于大多数应用程序来说已经足够了

没有可移植的c++方法来做到这一点。您需要创建一个文件(这是在使用ofstream打开文件进行写入时自动完成的),然后在完成文件时再次使用remove(使用C库函数remove)。但是您可以使用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()