未在 C++ 中打开时是否允许写入 ofstream
Is it allowed to write to a ofstream when it is not opened in c++
我有这样的代码:
# 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);
}
并保留写入文件的原样,我在 windows 上没有收到任何 运行时间错误。我的问题是,如果我不打开文件并写入其流,标准行为是什么?
我应该得到 运行 时间错误还是 ofstream 只是忘记数据而不是 运行 时间错误?
我正在使用 Visual Studio 2013.
如果您不打开该文件,您将拥有一个流,该流具有正在写入的默认构造的文件缓冲区,并且在丢弃 ofstream 时将被丢弃。
标准行为是第一次写入失败。这会设置 std::ofstream::badbit
并且进一步的写入将被静默忽略。
可以通过设置 m_myFile.exceptions(std::ofstream::badbit)
将这种静默失败更改为异常,但默认情况下它是关闭的。
您可以通过创建 "dev null" streambuf
然后将您的流切换到该缓冲区(通过 .rdbuf
)来使任何流(甚至 std::cout)丢弃其输出
我有这样的代码:
# 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);
}
并保留写入文件的原样,我在 windows 上没有收到任何 运行时间错误。我的问题是,如果我不打开文件并写入其流,标准行为是什么?
我应该得到 运行 时间错误还是 ofstream 只是忘记数据而不是 运行 时间错误?
我正在使用 Visual Studio 2013.
如果您不打开该文件,您将拥有一个流,该流具有正在写入的默认构造的文件缓冲区,并且在丢弃 ofstream 时将被丢弃。
标准行为是第一次写入失败。这会设置 std::ofstream::badbit
并且进一步的写入将被静默忽略。
可以通过设置 m_myFile.exceptions(std::ofstream::badbit)
将这种静默失败更改为异常,但默认情况下它是关闭的。
您可以通过创建 "dev null" streambuf
然后将您的流切换到该缓冲区(通过 .rdbuf
)来使任何流(甚至 std::cout)丢弃其输出