在C++中,当ofstream没有打开时,是否允许向其写入内容?

3

我有这样一段代码:

# in class definition
std::ofstream m_myFile;

## some where in code
m_myFile.open(filename);

然后在多个地方,我将文件写作如下:

m_myFile << "some data to file"<<std::endl;

现在这个功能已经很好用了,但是我需要给系统添加一个标记,当没有设置时,不应该创建和写入这个文件。我已经检查过了,如果我这样做,可以运行应用程序:

if(createFile)
{
      m_myFile.open(filename);
}

我没有打开文件并写入其流,文件的写入情况也没有出现任何运行时错误。我的问题是,如果我没有打开文件并写入其流,那么标准行为是什么?

我应该会得到一个运行时错误,还是ofstream会忽略数据而不会发生运行时错误?

我正在使用Visual Studio 2013。


std::ofstream 的构造函数会自动打开文件。你可能想使用 std::fstream,这样你就可以选择何时以及使用读取 std::fstream::in 或写入 std::fstream::out 模式打开文件。 - iammilind
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - mans
@iammilind std::ofstream有不止一个构造函数。接受字符串的构造函数(重载2和3 在此处)尝试打开流。默认构造函数(重载1)则不会。这就是为什么std::ofstream::open也存在的原因。 - Bulletmagnet
2个回答

5
标准行为是第一次写入失败。这将设置std::ofstream::badbit,并且后续的写入将被静默忽略。
通过设置m_myFile.exceptions(std::ofstream::badbit),可以将此静默失败更改为异常,但默认情况下此选项关闭。
您可以使任何流(甚至是std::cout)放弃其输出,方法是创建一个“dev null”streambuf,然后通过.rdbuf将您的流切换到该缓冲区。

@mans 看看这个话题。两个得票最高的答案都有代码示例,https://dev59.com/cGsy5IYBdhLWcg3w5CFr - Brandin
你所说的“失败”是什么意思?它是否生成了任何异常或运行时错误?这是允许的吗? - mans
我所说的“失败”是指:badbit已设置。这不会生成异常,除非你更改了默认设置。 - MSalters

0

如果您不打开文件,则会得到一个带有默认构造的文件缓冲区的流,该流正在被写入并将在ofstream被丢弃时被丢弃。


这个有什么不好的吗?比如会消耗大量内存或者崩溃吗?如果缓冲区满了会发生什么? - mans
我猜是的,这取决于你写了多少。你可以将所有内容都封装在一个对象中,如果文件没有打开就不必写入。这样你就不必担心往流中写入无用的内容了。 - Tasos Vogiatzoglou
@T.C. 你是什么意思?我已经测试了代码,它没有失败。 - mans
我的意思是,你正在向一个永远不会被写出的缓冲区写入内容。你可以将所有内容包装在一个类似于Logger的类中,并进行if (!osf.is_open()) { return ; }的判断,这样你就不必为你不使用的东西付费。代码本身不会失败,只是可以更高效。 - Tasos Vogiatzoglou
如果相关文件未打开,则overflow在执行任何操作之前返回Traits::eof()。 - MSalters
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接