2011-11-11 3 views
0

ユーザーが設定したブール値に応じて、コンソールまたはファイルに書き込むコードを書いています。ちょうどある可能性のあるデータ損失があるかどうかを知りたいですか?

コードは次のようになります。ここで

#include <iostream> 
#include <fstream> 

int main() 
{ 
    bool bDump; 
    std::cout<<"bDump bool"<<std::endl; 
    std::cin>>bDump; 
    std::ostream* osPtr; 
    std::ofstream files; 

    if(bDump) 
    { 
    files.open("dump.txt"); 
    osPtr = &files; 
    } 
    else 
    { 
    osPtr = &std::cout; 
    } 

    std::ostream& stream = *osPtr; 
    stream<<"hello"; 

    if(bDump) 
    { 
    files.close(); 
    } 
    return 0; 
} 

私がのstd :: ostreamにポインタを作成し、私はofstreamのオブジェクトまたはSTD :: coutのいずれかのアドレスをassingingいブール値に依存するのです。オープンまたはクローズのようなファイル操作が適切に行われるかどうかは私の唯一の関心事です。私はC++に新しいので、私を助けてください。また、ここで悪いプログラミングの実践が続いていることを指摘してください。

+0

試しましたか?あなたが望むように動作しましたか? –

+0

ええ、それは働いた。 –

答えて

4

その正しいと動作します。
私が別のことをする主なことは、デストラクタによって自動的に行われるnot to explicitly call close()です。

3進演算子でコードを少し簡略化して(ポインタを取り除く)ことができます。

#include <iostream> 
#include <fstream> 

int main() 
{ 
    bool bDump; 
    std::cout << "bDump bool"<<std::endl; 
    std::cin >> bDump; 
    std::ofstream files; 

    std::ostream& stream = (bDump) ? (files.open("dump.txt"), files) 
            : std::cout; 

    stream<<"hello";  
} 
+0

+1は主にその醜いポインタを取り除くためのものです。 :) – cHao

0

潜在的なリークはありません。例外が

stream<<"hello"; 

によってスローされた場合は、その後、

files.close(); 

が呼び出されることはありませんが、コードの特定の例のための心配はありません。 ofstreamのデストラクタはあなたのためにclose()を呼び出します。

+0

実際には、ファイルの処理が完了してからかなり長い間あなたの関数が実行されない限り、 'files.close()'は役に立たない。 (RAIIの全体的なポイントは、このようなものを扱うことです。それを信頼してください。)そして、この関数が長い間実行されていれば、心配する分離の問題があると思います。 – cHao

0

C++ではデストラクタを使用してクリーンアップを行い、std::ofstreamにはファイルを自動的に閉じるため、すべてを正常に完了しましたが、最後にclose()は必要ありません。

C++のmain()の末尾にあるreturn 0;ステートメントを省略することもできます。デフォルトでは0(成功、本当に)が返されます。

関連する問題