【问题标题】:Multiple output pointer to a file in c++C++中指向文件的多个输出指针
【发布时间】:2017-12-27 16:46:27
【问题描述】:

我想要两个指向 C++ 中同一个文件的指针。

#include <fstream>

int main()
{
    double a;
    std::ofstream fout1( "out.txt");
    fout1 << "CASE A:"<<std::endl;

    std::ofstream fout2( "out.txt", std::fstream::app);
    fout2 << "CASE B:" <<std::endl;

    for (int i=0; i < 3; i++){
        a = i*i;
        fout1 << a << std::endl;
        fout2 << 10+a <<std::endl;
    }
    return 0;
}

这段代码给我:

CASE A:
0
1
4


11
14

但我想:

CASE A:
0
1
4
CASE B:
10
11
14

在我的真实代码中,变量“a”是一个巨大的计算,所以做一个 double for 不是一个好的解决方案。我想到了 2 个解决方案:

  1. 使用 double 将“a”保存在向量中;
  2. 使用两个指向同一个文件的指针(当前问题);

我认为 2 是最好的,那么如何使用两个指针指向同一个文件呢?

【问题讨论】:

  • 你想在“0”之前写“CASE B”,但在文件中“0”之后出现,对吗?

标签: c++ output fstream


【解决方案1】:

使用两个流写入同一个文件将变成一场噩梦,您必须在一个流发生变化时刷新和重新同步,以确保另一个流看到这些变化。最好放弃这个想法并使用单个输出来解决问题。

如果你要坚持这个想法,每次你要切换到不同的流调用:

firstStrm.flush();
secondStrm.tie(firstStrm);
secondStrm.seekp(firstStrm.tellp())

其中 firstStrm 是您完成写入的流,而 secondStrm 是您要开始写入的流。

【讨论】:

  • 这不会满足 OP 的要求,因为在将所有数据写入 fout1 之前,您不知道从文件中的哪个位置开始写入 fout2。跨度>
【解决方案2】:

您遇到的根本问题是写入fout1 会破坏之前写入fout2。由于您不知道需要在文件中的哪个位置开始写出“CASE B”数据,因此您必须等到所有“CASE A”数据都写入后才能开始“CASE B”。

您可以将 CASE B 数据写入另一个(临时)文件,然后在完成 CASE A 后复制该数据(并删除临时文件),将要写入的数据累积到字符串缓冲区,然后写出来。

或者执行您的选择 1,即将所有 a 值保存到 vector 中,然后在最后处理这些值。这可能是最快的方法,但如果您有大量的数据内存可能是个问题,并且您必须采用两个文件的方法。

【讨论】:

    【解决方案3】:

    如果你想要两个指针指向同一个文件,那么创建它们:

    std::ofstream  fout("out.txt");
    std::ofstream * fout1(&fout);
    std::ofstream * fout2(&fout);
    

    具有多个指向输出流的指针的问题是,您可以根据执行情况以随机顺序输出数据。多线程或多任务的情况更糟。

    另一种解决方案是通过引用将输出流传递给构造函数或函数。一个类可以有一个流的副本

    class Hello
    {
      public:  
        Hello(std::ostream& output)
        : m_output(output)
        { }
      private:
        std::ostream& m_output;
    };
    

    【讨论】:

      猜你喜欢
      • 2021-11-06
      • 2014-09-10
      • 1970-01-01
      • 2016-03-05
      • 2019-09-10
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      相关资源
      最近更新 更多