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

时间:2011-10-15 15:56:02

标签: c++ libstdc++ mkstemp

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

3 个答案:

答案 0 :(得分:5)

没有。请注意,mkstemp不是C(至少是C99)或C ++标准的一部分 - 它是POSIX的补充。 C ++在C库部分只有tmpfiletmpnam

但是,

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位   随机性。这对于大多数应用来说已经足够了