ofstream的奇怪问题

andywei1982 2010-01-21 04:43:03
我在头文件中定义
std::ofstream m_osOutput;


在函数中这样写的,
void CServerLog::CreateLogFile(std::string strLogName)
{

m_osOutput.open(strLogName.c_str(), std::ios_base::app);
SetFileAttributes(strLogName.c_str(),FILE_ATTRIBUTE_NORMAL);
if (!m_osOutput)
{
int err = GetLastError();
}
}

strlongName ="d:\\runlog.txt"
我要实现的功能是:当runlog.txt不存在时创建并在尾部写日志,
如果存在的话直接在尾部写日志。

现在出的问题是:当runlog.txt文件存在时候,,err捕捉到的是183(当文件已存在时,无法创建该文件。)
如果runlog.txt不存在,err是5(拒绝访问。 )


有没有牛人帮忙分析下啊,,
...全文
96 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
至善者善之敌 2010-01-21
  • 打赏
  • 举报
回复
basic_filebuf<Elem, Tr> *open(
const char *_Filename,
ios_base::openmode _Mode,
int _Prot = (int)ios_base::_Openprot
);
basic_filebuf<Elem, Tr> *open(
const char *_Filename,
ios_base::openmode _Mode
);
basic_filebuf<Elem, Tr> *open(
const wchar_t *_Filename,
ios_base::openmode _Mode,
int _Prot = (int)ios_base::_Openprot
);
basic_filebuf<Elem, Tr> *open(
const wchar_t *_Filename,
ios_base::openmode _Mode
);
qynum123 2010-01-21
  • 打赏
  • 举报
回复
你得到的信息是完全正确的,请看下面针对具体代码的解释:
ERROR_ALREADY_EXISTS 183
Cannot create a file when that file already exists.

ERROR_ACCESS_DENIED
5
Access is denied.

而你调用文件的方式:
m_osOutput.open(strLogName.c_str(), std::ios_base::app);
看似你只传递了一个参数,但请看MSDN中的描述:
The member function calls rdbuf -> open(_Filename, _Mode | ios_base::out). If that function returns a null pointer, the function calls setstate(failbit).
因此实际上这个函数最终有二个参数:
std::ios_base::app 和 ios_base::out
那么这个函数是怎么执行的呢:
app:打开一个存在的文件并在尾部添加
out:创建一个新文件
所以当你一起用时就会出现:
文件存在时:
app,成功了,但函数再去out,这时发现文件已经被你打开,不能再创建同样的文件了,设置Error = 183
文件不存在时:
app,失败了,文件不存在,访问失败,设置Error = 5,接着去out,创建一个新的文件。

所以,实际上你不用去判断error值,你只要判断该函数的返回句柄是否为空就可以了:
ofstream ofs;
ofs.open(...)
if (ofs.IsOpen()) //or if (!ofs)
{
}
函数会自动的实现你想要的功能:如果文件存在,打开并在尾部添加,如果文件不存在,那就创建它。
一切OK了吧,:-)
太乙 2010-01-21
  • 打赏
  • 举报
回复
m_osOutput.open(strLogName.c_str(), std::ios_base::out|std::ios_base::app);
andywei1982 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
难道你的文件设置只读的?
[/Quote]

创建的时候是只读的,但是我把只读去掉,还是返回183错误啊,,
pengzhixi 2010-01-21
  • 打赏
  • 举报
回复
难道你的文件设置只读的?

64,644

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧