2017-12-27 833 views
-4

我想要两个指向C++中相同文件的指针。多输出指针指向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是最好的,所以我怎样才能使用两个指针到同一个文件?

+0

你想“0”之前写的“情况B”中,但之后出现*。*“0”的文件,是正确的? – Beta

回答

0

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

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

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

其中firstStrm是你完成的流与写作和secondStrm是流你想要开始写作。

+0

这不会做OP所需要的,因为在你将所有数据写入'fout1'之前,你不知道文件中的哪个位置开始用'fout2'写入。 – 1201ProgramAlarm

0

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

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

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

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