多重输出指针到C 中的文件

Multiple output pointer to a file in c++

本文关键字:文件 输出 指针      更新时间:2023-10-16

我想要两个指针到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"是一个巨大的计算,因此,双重的双重解决方案不是一个好的解决方案。我想到了两个解决方案:

  1. 使用double将向量保存" A";
  2. 使用两个指针到同一文件(当前问题);

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

使用两个流写入同一文件的流将变成噩梦,您必须在一个流中心更改的地方冲洗并recync,以确保另一个流看到这些变化。最好消除这个想法并使用单个输出解决问题。

如果您要坚持这个想法,则每次切换到其他流呼叫时:

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

firstStrm是您写作的流,第二strm是您要开始写作的流。

您遇到的基本问题是写信给fout1 Clobber先前写信给fout2。由于您不知道文件中需要开始写出"情况B"数据,因此您必须等到所有" case a a a a a case a a case a"都以" case b"开始之前。

您可以将案例B数据写入其他(临时)文件,然后在使用案例A完成后将数据复制(并删除临时文件),累积您将写入字符串缓冲区的数据,然后写出来。

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

如果您想要两个 pointers 到同一文件,然后创建它们:

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;
};