如何在 Linux 平台上创建用于用 C++ 编写的临时文件?

Posted

技术标签:

【中文标题】如何在 Linux 平台上创建用于用 C++ 编写的临时文件?【英文标题】:How can I create a temporary file for writing in C++ on a Linux platform? 【发布时间】:2008-10-01 22:08:08 【问题描述】:

在 C++ 中,在 Linux 上,我如何编写一个函数来返回一个临时文件名,然后我可以打开该文件名进行写入?

文件名应该尽可能唯一,这样使用相同函数的另一个进程就不会得到相同的名称。

【问题讨论】:

【参考方案1】:

使用标准库“mktemp”函数之一:mktemp/mkstemp/mkstemps/mkdtemp。

编辑:普通 mktemp 可能不安全 - mkstemp 是首选。

【讨论】:

这些返回一个已经打开的文件句柄,它不与 C++ 的 IO 流混合。例如,如果您需要使用 std::wofstream 来写入这个新文件怎么办?【参考方案2】:

tmpnam(),或者任何给你一个名字的东西都容易受到竞争条件的影响。使用为此目的设计的返回句柄的东西,例如 tmpfile():

   #include <stdio.h>

   FILE *tmpfile(void);

【讨论】:

【参考方案3】:

GNU libc 手册讨论了各种可用的选项及其注意事项:

http://www.gnu.org/s/libc/manual/html_node/Temporary-Files.html

长话短说,正如其他人所提到的,应该只使用 mkstemp() 或 tmpfile()。

【讨论】:

【参考方案4】:

man tmpfile

tmpfile() 函数打开一个唯一的二进制临时文件 读/写 (w+b) 模式。该文件将被自动删除时 已关闭或程序终止。ote

【讨论】:

【参考方案5】:

mktemp 应该可以工作,否则可以从大量可用库中选择一个来生成 UUID。

【讨论】:

【参考方案6】:

C 标准库中的tmpnam() 函数旨在解决这个问题。还有 tmpfile(),它返回一个打开的文件句柄(并在你关闭它时自动删除它)。

【讨论】:

不要使用 tmpnam()。从手册页:“永远不要使用这个函数。改用 mkstemp(3) 或 tmpfile(3)。” 糟糕。我没有注意问题的“在 Linux 上”部分。如果您不需要可移植性,mkstemp() 可能是正确的解决方案。【参考方案7】:

您应该简单地检查您尝试写入的文件是否已经存在。 这是一个锁定问题。 文件也有所有者,所以如果你做对了,错误的进程将无法写入。

【讨论】:

以上是关于如何在 Linux 平台上创建用于用 C++ 编写的临时文件?的主要内容,如果未能解决你的问题,请参考以下文章

在 UNIX(Linux 首选)上学习 C++ 编程的好书? [关闭]

如何在 c++ 中创建一个适用于 Windows 和 linux 的文件夹(目录)[重复]

Linux上从Java程序中调用C函数

如何编写真正的跨平台 C++ 库以进行分发

用 C++ 编写的文本编辑器插件系统

如何使用CMAKE生成makefile文件