【发布时间】:2014-07-14 13:55:54
【问题描述】:
下面是一个尝试将整数写入文件的简单类。写入文件的模式是在文件末尾追加字符(这种模式下文件不存在就创建)
#include <iostream>
#include <fstream>
class TestFileStream
{
private:
std::ofstream* _myFileStream;
bool isFileOpen;
public:
TestFileStream():isFileOpen(false)
{
_myFileStream = new std::ofstream("TestFile.txt", std::ios_base::out | std::ios_base::app );
isFileOpen = _myFileStream->is_open();
if( !isFileOpen )
{
std::cout << "Unable to open log file" << std::endl;
std::cout << "Good State: " << _myFileStream->good() <<std::endl;
std::cout << "Eof State: " << _myFileStream->eof() <<std::endl;
std::cout << "Fail State: " << _myFileStream->fail() <<std::endl;
std::cout << "Bad State: " << _myFileStream->bad() <<std::endl;
}
else
{
std::cout << "Opened log file" << std::endl;
}
}
~TestFileStream()
{
_myFileStream->close();
delete _myFileStream;
_myFileStream = nullptr;
}
void WriteFile( unsigned number )
{
if ( isFileOpen )
{
(*_myFileStream) << "Number: " << number << std::endl;
}
}
};
int main()
{
// Number of iterations can be multiple.
// For testing purpose, only 1 loop iteration executes
for( unsigned iter = 1; iter != 2; ++iter )
{
TestFileStream fileWriteObj;
fileWriteObj.WriteFile( 100+iter );
}
return 0;
}
当我执行上述代码时,我得到以下日志输出:
Unable to open log file
Good State: 0
Eof State: 0
Fail State: 1
Bad State: 0
这似乎是微不足道的任务,但我无法找出导致失败的原因。注意这个问题很可能和下面的question有关
【问题讨论】:
-
你为什么使用
new(无关)?你在当前目录的权限是什么? -
为我工作。可能是关于权限吗?
-
我的实际代码太大,无法在此处重现。 ,所以我在 ideone.com 上写了这个例子。也许与 ideone 上的文件写入权限有关。在我的实际代码中,我有 appx 50K 循环迭代。而且我每次循环迭代都会记录大量数据。该文件已创建并且确实被写入,但仅针对某些迭代..say 550 ...但对于剩余的迭代,我的代码一直显示错误“无法打开日志文件”。我不知道为什么会这样。
-
无需动态分配流,或使用 out 标志(ofstream 默认为 out),也无需在删除前关闭文件 - 它会自动发生。请注意,将 endl intead of "\n" 写入文件会更慢。
-
@NeilKirk:是的,我知道冗余输出标志并且不需要堆分配。相反,我的 TestFileStream 对象应该在堆上创建。我不知道文件关闭部分(谢谢)。我写 endl 只是为了刷新流。