打开并显示文本文件

tuncaysanli 2007-09-19 11:03:03
本人想 实现在文件菜单中使用“打开”项,选择一文本文件打开,然后在窗口中显示其内容。首先建立一MFC工程"打开并显示txt",然后在文档类中定义了一对象file,
public:
CStdioFile file;

然后在给文档类添加函数OnOpenDocument(),其内容如下:

BOOL CTxtDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;

// TODO: Add your specialized creation code here


file.Open(lpszPathName,CFile::modeRead | CFile::typeText); //打开文件

return TRUE;
}
然后在视图类的OnDraw()函数中,添加如下代码:


void CTxtView::OnDraw(CDC* pDC)
{
CTxtDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CString strTemp;
pDoc->file.ReadString(strTemp);
if(strTemp==NULL) return;
pDC->DrawText(strTemp,CRect(0,0,200,200),DT_SINGLELINE|DT_LEFT|DT_VCENTER );

pDoc->file.Close();
}
程序调试没问题,运行时弹出警告:“Debug Assertion Failed”,请问高手这是什么问题,该怎么解决?
...全文
1250 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
tuncaysanli 2007-10-08
  • 打赏
  • 举报
回复
又有新问题了,现在只能输出一页内容
,我已经将CView类替换成CScrollView类,并设置窗口大小已经足够大了,将窗口滚动到最底端还是只能显示一页(大该20行的内容),这是什么原因呢?该怎么修改?使其全部显示呢?
vace2008 2007-09-20
  • 打赏
  • 举报
回复
对不起,我理解错了
刚才翻了资料,liuxiuk的理解是对的
向liuxiuk道歉
我也是菜鸟,学习中……
xu_jian 2007-09-20
  • 打赏
  • 举报
回复
可能是pDoc->file.Close(); 这个地方错了,因为OnDraw函数在每次刷新的时候都要调用,而你文件在第一次刷新后就close了导致后面的ReadString出错
aXu 2007-09-19
  • 打赏
  • 举报
回复
没看代码,但是可以肯定是内存访问违规,造成的原因可能有几种:1、内存溢出;2、使用了野指针;3、指针没有初始化。建议你单步跟踪一下你的file指针,因为在打开文件时候出错,很可能是这个指针没有初始化。
everysmile 2007-09-19
  • 打赏
  • 举报
回复
在OnOpenDocument这个函数里面不是已经打开过了吗?
tuncaysanli 2007-09-19
  • 打赏
  • 举报
回复
本人将程序改了一下:先建立一MFC工程"打开并显示txt",然后在文档类中定义了一对象指针file,
public:
CStdioFile *file;
并在构造函数给它初始化:
CTxtDoc::CTxtDoc()
{

file=NULL;
}

CTxtDoc::~CTxtDoc()
{
if(!file==NULL) delete file;
}

然后在给文档类添加函数OnOpenDocument(),其内容如下:

BOOL CTxtDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;

// TODO: Add your specialized creation code here


file->Open(lpszPathName,CFile::modeRead | CFile::typeText); //打开文件

return TRUE;
}
然后在视图类的OnDraw()函数中,添加如下代码:


void CTxtView::OnDraw(CDC* pDC)
{
CTxtDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

CString strTemp;
if(!pDoc->file==NULL)
pDoc->file->ReadString(strTemp);
pDC->DrawText(strTemp,CRect(0,0,200,200),DT_SINGLELINE|DT_LEFT|DT_VCENTER );



}
程序调试没问题,运行也没问题,再单击文件中的打开,并选择一文本文件并确定,就弹出"应用程序出错,该内存不能为"read",请问高手这是什么问题,该怎么解决?

yydrewdrew 2007-09-19
  • 打赏
  • 举报
回复
从程序的最开始断点调试,找出出问题的地方
livedeal 2007-09-19
  • 打赏
  • 举报
回复
file还没有打开你就ReadString了,出错在这里``

用个BOOL变量,判断下```
liuxiuk 2007-09-19
  • 打赏
  • 举报
回复
你打开个txt文档

它的长度可能会大于一个view的大小

所以还要改变View类的继承关系,提供滚动显示

不然就不能完整显示文档

方法多种
譬如: CYourView:public CScrollView

-----
ls采用TextOut()输出也是不行的
在view下只会输出一行
总不至于把一个文档都一行输出吧?

lz代码中的输出方式是可行的!

按着提示慢慢来
不要copy代码
不然是不会提高的..
tuncaysanli 2007-09-19
  • 打赏
  • 举报
回复
多谢各位了。
tuncaysanli 2007-09-19
  • 打赏
  • 举报
回复
和气生财!小弟赔礼了!
liuxiuk 2007-09-19
  • 打赏
  • 举报
回复
OnDraw()需要添加吗?
OnDraw()是用来做什么的?
UpdateAllViews()又是赶什么的?
----
我没你误导的水平高吧
shit
vace2008 2007-09-19
  • 打赏
  • 举报
回复
楼上的不要误导人好不好,
OnDraw有OnDraw的作用
如果放在OnDraw里面,C***Doc更新,不好控制View类的显示。
liuxiuk 2007-09-19
  • 打赏
  • 举报
回复
用做显示用的就放在OnDraw()里面..
简单事复杂做
....

---------

自己不动脑筋
写什么代码..
vace2008 2007-09-19
  • 打赏
  • 举报
回复
是WM_PAINT的消息响应函数。
放在OnCreate()里面也可以
不过void C***Doc::OnFileOpen() 中的
UpdateAllViews(NULL);
改为
((C***View*)((CMainFrame*)AfxGetMainWnd())->GetActiveView())->Invalidate();
并在C**Doc类中包含
#include <mainfrm.h>
#include <***view.h>
tuncaysanli 2007-09-19
  • 打赏
  • 举报
回复
我应该联系到一块了啊。void C***View::OnPaint() 函数是在 C***View类中添加的 成员函数吧,添加了菜单项没? 好像只会执行C***View::OnDraw() 中的内容啊 。
vace2008 2007-09-19
  • 打赏
  • 举报
回复
怎么会,我已经测试通过了的,才发上来的。

是不是 void C***Doc::OnFileOpen() 你没有和菜单关联到一块?

void C***Doc::OnFileOpen() 这个函数,
是我新建了一个菜单项的一个命令响应函数。
tuncaysanli 2007-09-19
  • 打赏
  • 举报
回复
感谢vace2008() ,但是文本文件还是不能显示在窗口中啊!该怎么办啊?
vace2008 2007-09-19
  • 打赏
  • 举报
回复
//最后补一个
}
vace2008 2007-09-19
  • 打赏
  • 举报
回复
楼主的思路不正确。应该从文本读取文件后先存在内存中,再显示。
1、在C***Doc类中见PUBLIC: CStringArray m_arrData;
2、创建打开文件对话框
void C***Doc::OnFileOpen()
{
CFileDialog dlg(TRUE);
if(IDOK==dlg.DoModal())
{
CStdioFile file;
file.Open(dlg.GetFileName(),CFile::modeRead);
CString strTemp;
while(file.ReadString(strTemp)!=NULL)
{
m_arrData.Add(strTemp);
}
}
UpdateAllViews(NULL);
}
3.在C***View窗口中写出数据
void C***View::OnPaint()
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here

int nCount=GetDocument()->m_arrData.GetSize();
if(nCount!=0)
{
CSize sz=dc.GetTextExtent(GetDocument()->m_arrData.GetAt(0));
for(int i=0;i<nCount;i++)
{
dc.TextOut(0,sz.cy*i,GetDocument()->m_arrData.GetAt(i));
}
}
加载更多回复(3)

16,550

社区成员

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

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

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