请教:用CFile打开文件出错

steak_n_coke 2010-04-10 11:53:59
请教大家了!!
我正在写一个服务器程序,在Doc类中定义了一个文件和文件名:
CStdioFile file;
CString m_filename;

希望它能在文档初始化时读写一个文件data.txt。

BOOL CServerDoc::OnNewDocument()
{
if (!CRichEditDoc::OnNewDocument())
return FALSE;
// TODO: 在此添加重新初始化代码
BOOL flag;
CFileException ex;
this->m_filename=(LPCTSTR)"data.txt";

flag=file.Open(m_filename,CFile::modeReadWrite, &ex);
ASSERT (flag !=0);

this->m_pLstnSock= new LstnSock(this);
if(m_pLstnSock->Create(PORT)){
if(m_pLstnSock->Listen())
return TRUE;
}
return FALSE;
}
结果是: flag==0, ASSERT报错退出。
请问这到底是怎么回事呢???非常感谢!!!!!
...全文
451 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sou2012 2010-04-12
  • 打赏
  • 举报
回复
CFile::modeCreate
程老师2088 2010-04-12
  • 打赏
  • 举报
回复
顶一下 哈哈
尹成 2010-04-12
  • 打赏
  • 举报
回复
如果你是要打开现有文件 这文件又存在
10有89是因为你的文件路径的问题
当你Ctrl-F5/F5 你的当前目录并非project\debug\ 而是project\ 最好指定一个绝对路径如"C:\\xxx.txt"

如果要自动创建创建一个文件 应加上CFile::modeCreate


try
{
CFile file;
TCHAR szPath[] = _T(".\\data.txt");
file.Open(szPath, CFile::modeReadWrite);
file.Read(....); // Read data from data.txt file
...// Todo something else
file.Close();
}
catch(CFileException* e)
{
e->ReportError();
e->Delete();
}
黑嘿 2010-04-12
  • 打赏
  • 举报
回复
应加上CFile::modeCreate
cbib_cat 2010-04-12
  • 打赏
  • 举报
回复
得保证你要打开的文件存在或是路径正确
lwd4210 2010-04-12
  • 打赏
  • 举报
回复
楼主跑了,楼上随便找个都能解决你的问题,这都100分,太好赚了.
dqpi08 2010-04-12
  • 打赏
  • 举报
回复
字符串和路径检查一下应该没问题
踏实每一步 2010-04-12
  • 打赏
  • 举报
回复
While the CFile constructor will throw an exception in an error condition, Open will return FALSE for error conditions. Open can still initialize a CFileException object to describe the error, however. If you don't supply the pError parameter, or if you pass NULL for pError, Open will return FALSE and not throw a CFileException. If you pass a pointer to an existing CFileException, and Open encounters an error, the function will fill it with information describing that error. In neither case will Open throw an exception.

ls2141 2010-04-12
  • 打赏
  • 举报
回复
2楼说的就行了。。
an_bachelor 2010-04-12
  • 打赏
  • 举报
回复
如果你是要打开现有文件 这文件又存在
10有89是因为你的文件路径的问题
当你Ctrl-F5/F5 你的当前目录并非project\debug\ 而是project\ 最好指定一个绝对路径如"C:\\xxx.txt"

如果要自动创建创建一个文件 应加上CFile::modeCreate
wwgddx 2010-04-12
  • 打赏
  • 举报
回复
自己调试一下就知道问题出在哪里了.
wangli820 2010-04-12
  • 打赏
  • 举报
回复
this->m_filename=(LPCTSTR)"data.txt";
问题就在这一句
改为
this->m_filename= _T("data.txt");
zyq5945 2010-04-11
  • 打赏
  • 举报
回复
CFile::modeCreate不存在文件就创建
CFile f;
CFileException e;
TCHAR* pszFileName = _T("Open_File.dat");
if(!f.Open(pszFileName, CFile::modeCreate | CFile::modeReadWrite | CFile::modeNoTruncate, &e))
{
AfxMessagetBox(_T("File could not be opened %d\n"), e.m_cause);
return ;
}
// do something
f.Close();

steak_n_coke 2010-04-11
  • 打赏
  • 举报
回复
自己顶一下别沉了
Eleven 2010-04-11
  • 打赏
  • 举报
回复
try
{
CFile file;
TCHAR szPath[] = _T(".\\data.txt");
file.Open(szPath, CFile::modeReadWrite);
file.Read(....); // Read data from data.txt file
...// Todo something else
file.Close();
}
catch(CFileException* e)
{
e->ReportError();
e->Delete();
}
kevinmartin 2010-04-11
  • 打赏
  • 举报
回复
如果只用modeReadWrite,是必须要求文件存在的。

我也不清楚vc编译出来的程序自动把默认文件目录定在哪里,正常情况下应该是当前程序目录下,但也有可能是“我的文档”下。一旦你通过Open或者什么方式修改了目录,就会变更目录。所以建议用绝对目录处理。

如果文件不存在,用modeCreate | modeReadWrite,不存在的时候创建文件,然后再看看文件在哪里被创建了。
lsupper 2010-04-11
  • 打赏
  • 举报
回复
确认下,文件能找到吗?
z8y8x 2010-04-11
  • 打赏
  • 举报
回复
得保证你要打开的文件存在或是路径正确
Study_Knowledge 2010-04-11
  • 打赏
  • 举报
回复
ASSERT (flag !=0);
你把这一句话改为
if(!flag)
{
char buff[1024]={0};
sprintf(buff,"%d",ex.m_cause);
AfxMessageBox(buff);//看看跳出来的是几,然后通过错误查询去看一下是什么原因你就知道了
}
Study_Knowledge 2010-04-11
  • 打赏
  • 举报
回复
我想问一下你的那个文件是不是相对路径,放在什么位置的。是否放错位置了。。
加载更多回复(1)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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