2017-10-23 9 views
0

ofstreamをパラメータとする関数main.cppと関数自体を複数回呼び出す必要があるクラスのプログラムを作成しています.txtファイルの最後に新しいデータを追加する必要があります(この例では、単純化のためにint型のデータを作成しています)。C++:ストリーム&関数を.txtファイルに続けて追加する

何が起こっているのは、関数がmainで何回も呼び出されると、ファイルの最後に新しいデータを追加するのではなく、すべてを上書きするということです。私は自分のプログラムの仕事の中で他のすべてを知っていますので、私はちょうどそれがTLではないように、できるだけ裸の骨に取り除くつもりです; DR。私は含まれている

#include<fstream> 
using namespace std; 

私のすべてのファイルに含まれています。

ここでの要点です:main.cppに中

:aClass.hで

aClass* someClass = new aClass; 
int data = 0; 
... 
ofstream myfile ("file.txt"); 
someClass->appendData(myfile, data); 
... 

:aClass.cppで

void appendData(ofstream& myfile, int data); 

void aClass::appendData(ofstream& myfile, int data){ 
    if(myfile.is_open()){ 
     myfile << data << "\n"; 
     myfile.close(); 
    } 
    else cout << "Couldn't open file"; 
} 

誰かが私にこれを助けることができたら、私は感謝しますそれ。何らかの理由で、彼らは私たちに1年以上でfstreamsに触れさせていないし、私は問題が何であるか分からない。 appendData

+0

なぜ 'appendData'で' myfile.close() 'を呼びますか? –

+0

@RSahu私は私がそうしてはならないとは知らなかった。代わりにメイン出口の前でそれを行う必要がありますか?私はそれがスタックフレームの間に開いたままにしても大丈夫だとは知らなかった。 – BabaSvoloch

+0

'appendData'からそれを削除する。 'myfile.close()'を 'main'と呼ぶことはオプションです。デストラクタは 'close()'を呼び出します。しかし、オブジェクトに 'close()'を呼び出すと、オブジェクトにそれ以上書き込みを行わないと確信できれば害はありません。 –

答えて

1

コール

myfile.close(); 

権利ではありません。 myfileのそれ以降の出力操作は無視されます。

そこから削除します。

mainに追加することはできますが、これはオプションです。デストラクタはclose()を呼び出します。しかし、オブジェクトにclose()を呼び出すと、それ以上書込みに使用しないと確信しても害はありません

+0

後続の操作は無視されますか、またはUBですか? –

+0

@ GauravSehgal、それは無視されます。すべての出力関数が構築され、セントリリーオブジェクトがチェックされます。 sentryオブジェクトがストリームを書き込めないことを示す場合、何も行われません。 http://en.cppreference.com/w/cpp/io/basic_ostream/sentryに例が示されています。 –

関連する問題