为什么我写的程序不能读较大的.rtf文档却可以读.txt文档,请大虾帮指点指点!

解决方案 »

  1.   

    读文件时,在文档类的Serialize()函数中,调用其父类的Serialize()函数之前,将m_bRTF参数设为TRUE即可以处理.rtf文件,设为FALSE,处理txt文件
      

  2.   

    TOfengqinggao(风清高)大哥:不是说不能处理文件,只是不能处理超过4K的。RTF文件而已
      

  3.   

    奇怪啊,我这里随便存了一个280多K的文件,没问题啊,我用的是CRichEditView,你的也应该是吧,我好像没有碰到过这样的问题啊,跟踪一下看看
      

  4.   

    TOfengqinggao(风清高)大哥:我用的也是CRichEditView,可我都快傻掉了,我原来也用的好好的,现在不知道怎么回事突然就这样了,把我可郁闷坏了:(,你能否抽个空给我看看我的代码呀。
      

  5.   

    [email protected],发过来吧,我试一试,呵呵
      

  6.   

    问题已经解决,陈述如下:1、你用的不是CRichEditView,是CRichEditCtrl,所以我上面说的方法不太合适你,这两个东西还是有差别的,当是前者时,用Serialize就非常容易解决了,后者是否能用这个方法,没有研究过;
    2、问题在于,你的EditStreamCallback()这个回调函数的返回值错误,MSDN中如此描述:
    The callback function returns a nonzero value to indicate an error. If an error occurs, the read or write operation ends and the rich edit control discards any data in the pbBuff buffer. 
    就是说,如果返回值是非0时,就表示调用该函数错误,停止回调并且将已经读出的数据丢弃,而你的返回语句是:
    if (*pcb < cb)
    return 0; // file has been fully read in
    else
    return (DWORD) *pcb; // more to read
    当读数据正确时,返回的时读取数据的字节数,这恰好和上面的相反,所以系统认为错误,就停止读并且清空已读出的数据,所以你不出任何数据了;
    3、解决方法:
    在你的EditStreamCallback()只保留一个语句:
    return !ReadFile((HANDLE)dwCookie, pbBuff, cb, (unsigned long*)pcb, NULL);
    就可以了另外说一下,你的代码规范性实在不太好,读起来很费劲啊,再加上对回调函数不熟悉,而且没有用过这些函数,所以折腾了不少时间,呵呵
      

  7.   

    哦,还有一点忘了说了,EditStreamCallback函数每次默认读4092个字节(也就是4K),当文件小于4K时,读出的数据字节数*pcb是小于cb的,所以返回0,也就表示正确读出数据了,所以小于4k的数据,你的代码能读,而大于等于4K时,就会出现我上面所说的现象,也就不能读了