什么更有效的方法是保持fstream开放或每次需要使用时打开它?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么更有效的方法是保持fstream开放或每次需要使用时打开它?相关的知识,希望对你有一定的参考价值。

我的问题是,打开一个流并在程序结束时关闭它或者每次我想要使用它时打开它更好。我举一个例子。这是一个简单的Looger类:

class Logger
{
    Logger()
    {
         f.open("log.txt", std::ofstream::trunc);
    }

    ~Logger()
    {
         f.close();
    }
 public:
    static void log(const std::string& message)
   {
       static Logger l;
       l.f<< message<<'
';
   }
 private:
 std::osftream f;
};

那会更好吗?:

class Logger
{
    Logger()
    {
        f.open("log.txt", std::ofstream::trunc);
        f.close()
    }

    ~Logger()
    {
    }
 public:
    static void log(const std::string& message)
    {
       static Logger l;
       l.f.open("log.txt", std::ofstream::app);
       l.f<< message<<'
';
       l.f.close();
    }
 private:
 std::osftream f;
};
答案

一般情况下,您希望保持文件打开,因为如果文件以某种方式被用户替换,您的程序可能会非常不满意。例如,看看如果将编辑保存到长时间运行的.bat或bash脚本会发生什么。此外,打开和关闭文件存在速度问题。

另一方面,对于开发期间的详细日志记录,日志文件状态在每条消息之后关闭的好处,尽管任何级别的崩溃甚至可能阻止操作系统保存任何缓冲内容,即使它是flush()ed,并且其他一些工具可以在新的日志文件中旋转,可能意味着它的好处是值得的,但仅限于日志记录。

另一方面,编写自己的日志文件循环并不是特别困难(关闭并重新打开,下一个名称很少MB),保持文件打开的速度优势可能使日志记录更具吸引力。

以上是关于什么更有效的方法是保持fstream开放或每次需要使用时打开它?的主要内容,如果未能解决你的问题,请参考以下文章

什么更有效:排序流或排序列表?

只进行一次查询并将其存储在数组中还是每次都进行查询更有效?

DSTC10开放领域对话评估比赛冠军方法总结

什么是更有效的堆栈内存或堆? [复制]

什么时候 ArrayList 比在 C# 中使用数组更有效? [复制]

带有 fstream 或数据库的 C++