我正在将使用临时文件的程序从 POSIXFILE
转换为 C++ 标准库 iostream。mkstemp 的正确替代方法是什么?
问问题
11541 次
3 回答
6
空无一人。请注意,mkstemp
它既不是 C(至少是 C99)也不是 C++ 标准的一部分——它是 POSIX 的补充。C++ 只有tmpfile
和tmpnam
在 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 回答