关闭文件流时出错,该文件流的存在取决于与C ++中的.close()语句相同的bool

时间:2012-11-28 10:32:13

标签: c++ ofstream

我在写这个问题时遇到了问题(正如你可能从标题中看到的那样),但我会尝试:

如果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

3 个答案:

答案 0 :(得分:4)

您在if块的范围内声明fout,else块具有单独的范围,其自身的自动变量fout不是一个。

然而,你实际上并不需要担心它,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

上面的代码很好。

答案 1 :(得分:1)

错误是因为您在“if-statement”中定义了“fout”,并且没有在该区域之外定义(在if语句之外) 你可以这样做:

#include <fstream>
using namespace std ;

int main()
{
     ofstream fout ;
     bool output = true ;
     if(output)
     {
          fout.open("test.txt");
     }
     if(output)
     {
          fout.close(); 
     }
  }

答案 2 :(得分: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;
         }
    }

};

注意 - 在您需要输入的错误检查方面存在很多缺失 - 例如,如果无法打开文件名会发生什么。

然后在main中你可以有这样的东西:

#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,可能甚至可以访问您要编写的内容,但如果是这种情况,则可能需要处理{{1}虽然它需要重命名和不同的方法......