多个输出指针指向c ++中的文件

时间:2017-12-27 16:46:27

标签: c++ output fstream

我想在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. 使用指向同一文件的两个指针(当前问题);
  3. 我认为2是最好的,所以如何使用两个指向同一个文件的指针?

3 个答案:

答案 0 :(得分:0)

使用两个流写入同一个文件将变成一场噩梦,您必须在一个流更改的位置刷新和重新同步,以确保另一个流看到这些更改。更好地消除这个想法并使用单个输出来解决问题。

如果你想坚持这个想法,每次你要切换到另一个流电话:

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

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

答案 1 :(得分:0)

你遇到的根本问题是写入 <input type='file' id='testfile' style='display:none' /> <button onclick='document.getElementById("testfile").click()'>Upload</button> <script> var testfile = document.getElementById('testfile') testfile.onclick = focus(); function focus() { document.body.onfocus = invoke(); } function invoke() { if(testfile.value.length) { alert('has file'); } else {alert('empty')} </script> clobber以前写入fout1。由于您不知道文件中的哪个位置需要开始写出“CASE B”数据,因此必须等到所有“CASE A”数据都写入“CASE B”开始之前。

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

或者做出选择1,即将所有fout2值保存到a中,然后在最后处理这些值。这可能是最快的方法,虽然如果你有大量的数据内存可能是一个问题,你必须采用两种文件方法。

答案 2 :(得分:0)

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

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