【问题标题】:C++ can I reuse fstream to open and write multiple files?C++ 我可以重用 fstream 来打开和写入多个文件吗?
【发布时间】:2010-02-17 22:09:20
【问题描述】:

我有 10 个文件需要打开以按顺序写入。我可以有一个 fstream 来执行此操作吗?我是否需要在每个文件之间执行任何特殊操作(flush() 除外),或者只为每个文件调用 open(file1, fstream::out | std::ofstream::app) 并在所有 10 个文件写入结束时关闭流。

【问题讨论】:

    标签: c++


    【解决方案1】:

    您需要先将其关闭,因为在已打开的流上调用 open 会失败。 (这意味着 failbit 标志设置为 true)。注意close() 刷新,所以你不必担心:

    std::ofstream file("1");
    // ...
    file.close();
    file.clear(); // clear flags
    file.open("2");
    // ...
    
    // and so on
    

    另外注意,最后一次不需要close();析构函数为您执行此操作(因此也为flush()'s)。这可能是一个很好的实用功能:

    template <typename Stream>
    void reopen(Stream& pStream, const char * pFile,
                std::ios_base::openmode pMode = ios_base::out)
    {
        pStream.close();
        pStream.clear();
        pStream.open(pFile, pMode);
    }
    

    你会得到:

    std::ofstream file("1");
    // ...
    reopen(file, "2")
    // ...
    
    // and so on
    

    【讨论】:

    • 最好在对close()open() 的调用之间插入对clear() 的调用,因为不会清除状态标志。详细解释见gcc.gnu.org/onlinedocs/libstdc++/…
    • FILE 变量有类似的东西吗?我的意思是多次重用。 Aspecialy 给他们写信。 fclose() 没有帮助。
    【解决方案2】:

    关闭一个流意味着flush(),所以只要你close()每个流在你打开下一个流之前你应该没问题。

    【讨论】:

      【解决方案3】:

      是的,但每次打开下一个文件之前都必须关闭 fstream。

      但是,最好为每个文件访问使用一个新的作用域 fstream 对象,以利用构造函数和析构函数行为:

      struct {
          const char *filename;
          void (*operation)(fstream&);
      } filelist[] = {
          { "file1", callback1 },
          { "file2", callback2 },
          ...
          { "file10", callback10 },
      };
      
      for (int i = 0; i < 10; ++i) {
          fstream f(filelist[i].filename);
          filelist[i].operation(f);
      }
      

      在上面的代码示例中,每次通过 for 循环都会刷新和关闭 fstream,因为当对象失去作用域时会调用析构函数。 fstream 通过引用 callback function 传递,因此可以在每个文件的基础上处理操作,而无需使用讨厌的 switch 语句。如果每个文件的操作相同,则可以消除该构造。

      【讨论】:

        猜你喜欢
        • 2012-04-24
        • 1970-01-01
        • 1970-01-01
        • 2011-06-09
        • 1970-01-01
        • 2019-06-25
        • 1970-01-01
        • 1970-01-01
        • 2022-08-18
        相关资源
        最近更新 更多