2017-12-27 832 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; 
};