2017-12-27 22 views
-4

C++で同じファイルに2つのポインタが必要です。C++のファイルへの複数出力ポインタ

CASE A: 
0 
1 
4 


11 
14 

をしかし、私はしたい::

#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 
CASE B: 
10 
11 
14 

"" 巨大な計算なので、doubleをしないだろう良い解決策になります。私は2つの解を考えました:

  1. "a"をベクトルに保存するためにdoubleを使用します。
  2. 同じファイルに2つのポインタを使用する(現在の質問)。

私は2が最高だと思うので、どのように私は同じファイルに2つのポインタを使用できますか?

+0

あなたが「0」の前に「CASEのB」を書きたいのが、それは後に*表示されている*「0」ファイルに、ということは正しいでしょうか? – Beta

答えて

0

2つのストリームを使用して同じファイルに書き込むことは悪夢に変わります。一方のストリームが変更された場合は、そのストリームが変更されたことを確認するためにフラッシュして再同期する必要があります。このアイデアを取り除き、単一の出力を使用して問題にアプローチする方がはるかに優れています。

あなたのアイデア、あなたが別のストリーム通話に切り替えるしようとしているたびに固執しようとしている場合:

firstStrmは、あなたがして書いて行われたストリームであるとsecondStrmはストリームあなたです
firstStrm.flush(); 
secondStrm.tie(firstStrm); 
secondStrm.seekp(firstStrm.tellp()) 

と書いてみたい

+0

これは、 'fout1'にすべてのデータを書き出すまで、' fout2'で書き込みを開始するファイルのどこがわからないので、OPが望んでいることはしません。 – 1201ProgramAlarm

0

あなたが持っている根本的な問題は、fout1クローバーへの書き込みがfout2に書かれていることです。ファイル内のどこに "CASE B"データを書き始める必要があるかわからないので、 "CASE B"で始める前に、すべての "CASE A"データが書き込まれるまで待たなければなりません。

CASE Bのデータを別の(一時的な)ファイルに書き込んだり、CASE Aの処理が完了したらそのデータをコピーしたり(テンポラリファイルを削除する)、書き込むデータをストリングバッファを作成し、それを書き出します。

aの値をすべてvectorに保存し、最後に処理します。これはおそらく最も速い方法ですが、大量のデータメモリが懸念される可能性があり、2つのファイルアプローチを使用する必要があります。

0

あなたが同じファイルを2つののポインタをしたい場合は、それらを作成します。

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

出力ストリームに複数のポインタを持つ問題は、ランダムな順序でデータ出力を持つことができています、実行に応じてこれは、複数のスレッドまたは複数のタスクでは悪化します。

もう1つの解決策は、出力ストリームを参照によってコンストラクタまたは関数に渡すことです。クラスは、ストリームのコピー持つことができます。

class Hello 
{ 
    public: 
    Hello(std::ostream& output) 
    : m_output(output) 
    { } 
    private: 
    std::ostream& m_output; 
}; 
関連する問題