【问题标题】:How to create a temporary text file in C++?如何在 C++ 中创建临时文本文件?
【发布时间】:2010-11-04 13:58:12
【问题描述】:

我正在尝试在 C++ 中创建一个临时文本文件,然后在最后将其删除 的程序。我对谷歌的运气并不好。

您能告诉我要使用哪些功能吗?


下面的答案告诉我如何创建临时文件。如果我只想 创建一个文件(tmp.txt)然后删除它?我该怎么做?

【问题讨论】:

标签: c++ file


【解决方案1】:

也许这会有所帮助

FILE * tmpfile ( void );

http://www.cplusplus.com/reference/clibrary/cstdio/tmpfile/

打开一个临时文件

创建一个临时二进制文件,打开 用于更新(wb+ 模式 -- 参见 fopen for 细节)。文件名有保证 与任何其他人不同 现有文件。临时文件 created 时自动删除 流关闭(fclose)或何时 程序正常终止。

另见

char * tmpnam ( char * str );

生成临时文件名

包含文件名的字符串 与任何现有文件不同的是 生成。该字符串可用于 创建一个临时文件 覆盖任何其他现有文件。

http://www.cplusplus.com/reference/clibrary/cstdio/tmpnam/

【讨论】:

  • 值得一提的是,在某些情况下 tmpfile() 和 tmpnam() 可能存在问题,例如codeproject.com/KB/web-security/TemporaryFileSecurity.aspx
  • tmpfile当然有返回C文件句柄的问题,不是c++流。
  • @rlbond:确实,这就是我包含 tmpnam 的原因。
  • 请务必注意不要使用 tmpnam()。它的手册页说:“永远不要使用这个函数。改用 mkstemp(3) 或 tmpfile(3)。”
  • 临时文件到底是在哪里创建的?
【解决方案2】:

这是一个完整的例子:

#include <unistd.h>

int main(void) {
  char filename[] = "/tmp/mytemp.XXXXXX"; // template for our file.        
  int fd = mkstemp(filename);    // Creates and opens a new temp file r/w.
                                 // Xs are replaced with a unique number.
  if (fd == -1) return 1;        // Check we managed to open the file.
  write(fd, "abc", 4);           // note 4 bytes total: abc terminating '\0'
  /* ...
     do whatever else you want.
     ... */
  close(fd);
  unlink(filename);              // Delete the temporary file.
}

如果您知道要创建的文件的名称(并且确定它不存在),那么您显然可以使用open 打开文件。

tmpnamtmpfile 应该避免使用,因为它们可能会受到竞争条件的影响 - 有关详细信息,请参阅 man tmpfile(3)

【讨论】:

【解决方案3】:

这可能有点跑题了,因为作者想创建一个 tmp.txt 并在使用后将其删除,但这很简单——您可以简单地 open() 并删除它(使用 boost::filesystem 的当然)。

mkstemp() 是基于 UNIX 的。在 Windows 中,您可以使用 GetTempFileName() 和 GetTempPath() 生成临时文件的路径。来自 MSDN 的示例代码:

http://msdn.microsoft.com/en-us/library/aa363875%28VS.85%29.aspx

【讨论】:

    【解决方案4】:

    在 Linux(从内核 3.11 开始)上,有一个 open(2) O_TMPFILE 标志,它会创建一个没有名称的临时文件(即它不会出现在文件系统中)。这有一些有趣的功能:

    • 不用担心唯一名称,它只是一个 inode,没有名称。
    • 创建期间没有竞争条件(例如符号链接攻击)。
    • 如果您的应用崩溃,则不会出现任何杂散文件,它始终会自动删除。

    【讨论】:

    【解决方案5】:

    如果您需要一个命名文件(例如,您可以将名称传递给另一个进程,可能是编译器或编辑器),然后注册一个清除函数,使用atexit() 删除该文件。您可以使用 C++ &lt;iostream&gt; 或 C FILE * (&lt;cstdio&gt;) 创建文件。不完全标准但广泛使用的mkstemp() 函数创建一个文件并告诉您它的名称以及返回一个文件描述符(第三种 I/O 机制);您可以使用fdopen() 函数将文件描述符转换为FILE *

    如果您不需要命名文件,C 风格的FILE * 就可以,然后按照@Tom 的建议查看tmpfile()

    【讨论】:

      【解决方案6】:

      我想知道为什么你们中的大多数人向他展示了 C 方法而不是 C++ 方法。
      这是fstream
      试试吧,删除文件取决于操作系统,但您可以使用 boost.filesystem 让事情变得简单。

      【讨论】:

      • 这可能是因为 OP 要求提供临时文件,并且没有标准的 C++ 机制来创建唯一文件名。 libstdc++ 或 boost 中没有任何东西可以真正取代 mkstemp()。
      【解决方案7】:

      Boost 提供了一种干净、可移植且不弃用的创建临时文件的方法:

      auto temporary_file = boost::filesystem::temp_directory_path() / boost::filesystem::unique_path();
      

      【讨论】:

        【解决方案8】:

        好吧,假设你已经成功创建了临时文件,你可以使用remove函数删除它。

        函数在 stdio.h 中声明 -

        #include <stdio.h>
        
        int remove(const char *pathname);
        

        例如,如果你想删除一个名为 myfile.txt 的文件,代码将是

        #include<stdio.h>
        
        int main()
        {
          if(remove("myfile.txt") == -1)
          {
            fprintf(stderr,"Remove failed");
            exit(EXIT_FAILURE);
          }
          exit(EXIT_SUCCESS);
        }
        

        我希望到现在为止,您已经知道如何创建临时文件,所以这应该可以解决您的查询。 希望对您有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-19
          • 1970-01-01
          • 1970-01-01
          • 2012-06-14
          • 2011-03-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多