什么是mkstemp的C++标准库等价物?

vy3*_*y32 9 c++ mkstemp libstdc++

我正在转换使用POSIX临时文件FILE到C++标准库iostreams的程序.什么是mkstemp的正确替代品?

Cat*_*lus 5

空无一人.请注意,mkstemp它不是C(至少是C99)或C++标准的一部分 - 它是POSIX的补充.C++只tmpfiletmpnam在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)

  • @ vy32:那太傻了.Boost事实上是C++中的第二个标准库.避免它会适得其反.AFAIK IOStreams没有太多依赖项,因此如果您不希望别人单独下载它,您可以将其包含在您的代码中. (5认同)

ann*_*nno 5

如果你想要一个可移植的 C++ 解决方案,你应该在boost::filesystem 中使用 unique_path :

unique_path 函数生成适合创建临时文件(包括目录)的路径名。该名称基于使用百分号字符指定替换为随机十六进制数字的模型。[注意:生成的路径名中的随机性越多,先前存在或被猜测的可能性就越小。模型中的每个替换十六进制数字都会增加四位随机性。因此,默认模型提供 64 位随机性。这对于大多数应用程序来说已经足够了

  • 谢谢。但我不想使用`boost`。它没有内置在我的编译器中,我不想要求人们使用我的源代码下载 boost。 (3认同)
  • 由于其导致的竞争,Boost 的“unique_path”与“std::tmpnam”一样糟糕。 (2认同)

Chr*_*ica 4

没有可移植的 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)