只是想知道是否有可能的数据丢失?

时间:2011-11-11 02:43:04

标签: c++ file-io

我写了一段代码,根据用户设置的布尔值写入控制台或文件。

代码看起来像这样。

#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的地址。我唯一担心的是打开还是关闭等文件操作是否正确完成。因为我是c ++的新手,请帮助我。还要指出这里是否有任何糟糕的编程习惯。

3 个答案:

答案 0 :(得分:4)

它的正确和有效。
我不同的主要做法是not to explicitly call close(),因为这是由析构函数自动完成的。

您可以使用三元运算符稍微简化代码(并删除指针);

#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";    
}

答案 1 :(得分:0)

没有潜在的泄漏。但是,如果

引发异常
stream<<"hello";

然后

files.close();
永远不会调用

,但是对于您的特定代码示例,没有任何问题。 ofstream的析构函数碰巧为你调用close()。

答案 2 :(得分:0)

你做得很好,但最后不需要close(),因为在C ++中我们依靠析构函数为我们清理,std::ofstream有一个自动关闭文件的文件

您还可以省略C ++中return 0;底部的main()语句:默认情况下会返回0(成功,真的)。