3

この質問の言い回しに問題があります(タイトルからわかるように)が、試してみます:

bool変数がtrueの場合にファイルストリーム(ofstream)を開いていますが、同じboolがtrueの場合にファイルストリームを再度閉じようとするとエラーが発生します

'fout' was not declared in this scope"

最小限の例を次に示します。

using namespace std;
#include <fstream>

int main(int argc, char * argv[]) {
    bool output = true;

    if (output) {
        ofstream fout("test.txt");
    }
    if (output) {
        fout.close();
    }
} // end main

私がやろうとしているのは、ブール値の「出力」が真である場合にのみ、プログラムからの結果を格納するためのファイルを開くことです。毎回ファイルを開くようにすることもできますが(テストの場合は不可)、実際のファイル名はプログラムで設定された変数に依存し、古​​いファイルを上書きしたくないため、しばらくすると非常に面倒になります。だから私はむしろこのようにしたいです。

編集:今日、私は「スコープ」が何であるかを学びました...みんなありがとう!
動作するコードは次のようになります。

using namespace std;
#include <fstream>

int main(int argc, char * argv[]) {
    bool output = true;
    ofstream fout;
    if (output) {
        fout.open("test.txt");
    }
    if (output) {
        fout.close();
    }
} // end main
4

3 に答える 3

4

ifブロックのスコープ内で宣言するfoutと、elseブロックには、それ自体の自動変数がfout1つではない別個のスコープがあります。

ただし、ここでは実際に心配する必要はありませんofstream。RAIIに準拠しているため、スコープから外れると閉じます。

http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization

実際、自分で閉じるよりも、自分で閉じる方が望ましいです。

http://en.cppreference.com/w/cpp/io/basic_ofstream

(デストラクタの横のコメントに注意してください)。

int main(int argc, char * argv[]) {
    bool output = true;

    if (output) {
        ofstream fout("test.txt");
                    //do with fout, let it close itself
    }
} // end main

上記のコードは問題ありません。

于 2012-11-28T10:37:23.987 に答える
1

エラーは、「if-statement」で「fout」を定義していて、その領域の外(if-statementの外)で定義されていないためです。代わりに次のようにすることができます。

#include <fstream>
using namespace std ;

int main()
{
     ofstream fout ;
     bool output = true ;
     if(output)
     {
          fout.open("test.txt");
     }
     if(output)
     {
          fout.close(); 
     }
  }
于 2012-11-28T10:42:01.857 に答える
0

思考の糧 :)

ofstream最小限の例の簡単な解決策は、それを使用する必要がある期間、それが存在するスコープでを宣言することです。次に、実際にストリームを使用する条件ステートメントがあります。

{
    bool output = someArgOrTestResult;
    ofstream myOutStream;

    if( output ) mOutStream << "Whatever";

}

ただし、繰り返される条件ステートメントは、(a)醜く、(b)動作を変更することを決定した場合、維持するのが困難になる可能性があります。したがって、自分が何をしているのかを見て、MyOutputクラスを作成することが有益な場合があります。

class MyOutput
{
private:
    std::string filename;
    bool output;
    ofstream fout;

public:
    MyOutput( const std::string& fn , bool out ) : filename(fn) , output(out) 
    {
         if( output )
             fout.open(filename); //Check syntax might need .c_str()       
    }

    ~MyOutput()
    {
         if( output )
             fout.close();
    }

    //There are many ways to expose the output function but simplest
    void write( const std::string& data )
    {
         if( output )
         {
             output << data;
         }
    }

};

-入力する必要があるエラーチェックに関しては、多くの欠落があります-たとえば、ファイル名を開くことができない場合はどうなりますか。

次に、メインで次のようなものを使用できます。

#include <fstream>

int main(int argc, char * argv[]) {
    bool output = true;
    MyOutput fout("test.txt",output);

    std::string myLocalData = "Some stuff....";
    fout.write(myLocalData);


} // end main

現在の利点は、周囲のテストなしでデータを書き込むためのステートメントを持つことができることです。outputこれには何百万ものバリエーションがあり、設定されていなくても書き込みたいものにアクセスできる可能性がありますが、その場合MyOutputは、名前を変更してさまざまな方法...

于 2012-11-28T11:09:13.163 に答える