10

我正在将使用临时文件的程序从 POSIXFILE转换为 C++ 标准库 iostream。mkstemp 的正确替代方法是什么?

4

3 回答 3

6

空无一人。请注意,mkstemp它既不是 C(至少是 C99)也不是 C++ 标准的一部分——它是 POSIX 的补充。C++ 只有tmpfiletmpnam在 C 库部分。

然而,Boost.IOStreamsfile_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;
于 2011-10-15T16:04:51.777 回答
5

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

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

于 2011-10-15T17:23:14.227 回答
4

没有可移植的 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()
于 2011-10-15T16:07:03.157 回答