Win32中,ReadHuge()已作废,请使用Read()

解决方案 »

  1.   

    我开始用的就是Read(),也不行.
      

  2.   

    在我的机器上运行是对的,下面是我将程序改动了一点点后,在我的机器上的运行结果:
    改动程序:
    CString string1,string2,oldfile,newfile;
    CFile file;
    char* buffer;
    UINT i,j;
    UpdateData(TRUE);
    // string1=m_first;
    // string2=m_last;
    file.Open("C:\\haha.html",CFile::modeRead | CFile::shareDenyNone,NULL);
    file.SeekToEnd();
    i=file.GetLength();
    TRACE("the old file length is %d\n",i);
    buffer = new char[i];
    file.SeekToBegin();
    j=file.ReadHuge(buffer,i);
    TRACE("file read %d bytes \n",j);
    oldfile=CString(buffer);
    FILE *f;
    f=fopen("C:\\hah1.html","w");
    fprintf(f,"%s",oldfile);
    fclose(f);
    delete buffer;
    CDialog::OnOK();被读取的文件:27K多
    读取结果正确
      

  3.   

    可是我要对CString中的内容处理的时候就出错.
    我是要把HTML文件中,两个关键字之间的内容提取出来,这时结果为空.
    void CWordDlg::OnOK() 
    {
    CString string1,string2,oldfile,newfile;
    CFile file;
    char* buffer;
    UINT i,j;
    UpdateData(TRUE);
    string1=m_first;
    string2=m_last;
    file.Open("E:\\例子\\20000516.htm",CFile::modeRead|CFile::shareDenyNone,NULL);
    file.SeekToEnd();
    i=file.GetLength();
    TRACE("the old file length is %d\n",i);
    buffer = new char[i];
    file.SeekToBegin();
    j=file.Read(buffer,i);
    TRACE("file read %d bytes \n",j);
    oldfile=CString(buffer);
    newfile=oldfile.Left(oldfile.Find((LPCTSTR)string1,0));
    newfile=newfile.Right(newfile.Find((LPCTSTR)string2,0));
    file.Open("E:\\例子\\s20000516.htm",CFile::modeCreate|CFile::modeWrite,NULL);
    i=newfile.GetLength();
    TRACE("the new file is %s\n",i);//i 为空
    file.SeekToBegin();
    file.Write((LPCTSTR)newfile,i); delete buffer;
    CDialog::OnOK();
    }
      

  4.   

    newfile=newfile.Right(newfile.Find((LPCTSTR)string2,0));这句写错了,应该为:newfile=newfile.Right(newfile.GetLength() - newfile.Find((LPCTSTR)string2,0) - string2.GetLength());按你的逻辑应该string2为首关键字,string1为尾关键字。第一句使newfile得到oldfile中尾关键字前的字符串没有错,但第二句中Right()中的参数为首关键字开始的位置,正确的应该是newfile总长度减去首关键字开始位置再减去首关键字长度。比如:
    string1=">";
    string2="<"
    oldfile="aa<1234>bb";
    执行完第一句后,newfile="aa<1234"
    此时newfile.Find(..)返回值为2,接下去应该明白了吧
      

  5.   

    我也用daidai 的方法试了一下,很是奇怪,文件中的东东能全部读进内存,
    但是在buffer中却只能看到一部分,这是为什么,?我用的是debug时察看内存
    窗口.
      

  6.   

    CString显示时不会把所有的东东都显示出来,只有用看内存的方式才能看见全部的信息.
    以前我也遇到这个问题.
      

  7.   

    我也做过从一个HTML中找特定的字串的程序.当然是自己用着玩:)
    不过我没有一次读入所有的字串,我用了CArchive,一次读一行,在CString里进行查行,
    有兴趣的话你也可以试试.
      

  8.   

    回答guojin的问题;
     debug显示CString 或 LPSTR等时,显示到第一个 0x00即中止,
       C中字符串以 0x00 结尾,即使你的 string buffer中后面还有数据,
       debug也不显示,
      

  9.   

    谢谢Tiangz兄.
    buffer是字符数组,非CString.我又看了buffer中显示的数据的附近
    没有0x00!可能不是这个问题.
    在file.Read()前得到的文件的长度为5888字节,file.Read()后返回
    的读到buffer中得个数也为5888.
    我于是又把buffer中的东东,写到另外一个文件中去,哈哈,果然成功了
    .第二个文件与第一个文件一模一样!!!
    得到的结论是:debug时,有可能为了不过分占据桌面窗口,对于过分长的
    字符串,只显示其中的一部分!
      

  10.   

    解决了,用CStdoiFile一次处理一行,但我还有一个问题,下面这段程序是得到文件夹
    中所有文件名,为什么只能得到最多255个文件呢,再多就出错.filename[]是个大数组
    CString m_SourPath = m_directory + "*.*";
    WIN32_FIND_DATA name;
    HANDLE x = ::FindFirstFile(m_SourPath, &name); 
    j=0;
    while (::FindNextFile(x, &name)) 
    {
    if (name.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) 
             {  
         CString m_Ext = name.cFileName;
                  if(m_Ext.Find(".htm")!=-1)
                 {
                       filename[j++]=m_Ext;
        }
            }
    }