ReadHuge?Cstring有大小限制?

daidai 2000-07-24 10:34:00
运行下面这段程序时为什么只能读出很小的一部分文件内容?
源文件有35k
请高手赐教
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 and 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);
delete buffer;
CDialog::OnOK();
}
...全文
468 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
guojin 2000-07-26
  • 打赏
  • 举报
回复
谢谢Tiangz兄.
buffer是字符数组,非CString.我又看了buffer中显示的数据的附近
没有0x00!可能不是这个问题.
在file.Read()前得到的文件的长度为5888字节,file.Read()后返回
的读到buffer中得个数也为5888.
我于是又把buffer中的东东,写到另外一个文件中去,哈哈,果然成功了
.第二个文件与第一个文件一模一样!!!
得到的结论是:debug时,有可能为了不过分占据桌面窗口,对于过分长的
字符串,只显示其中的一部分!
Tiangz 2000-07-26
  • 打赏
  • 举报
回复
回答guojin的问题;
debug显示CString 或 LPSTR等时,显示到第一个 0x00即中止,
C中字符串以 0x00 结尾,即使你的 string buffer中后面还有数据,
debug也不显示,
VictorYu 2000-07-26
  • 打赏
  • 举报
回复
我也做过从一个HTML中找特定的字串的程序.当然是自己用着玩:)
不过我没有一次读入所有的字串,我用了CArchive,一次读一行,在CString里进行查行,
有兴趣的话你也可以试试.
VictorYu 2000-07-26
  • 打赏
  • 举报
回复
CString显示时不会把所有的东东都显示出来,只有用看内存的方式才能看见全部的信息.
以前我也遇到这个问题.
guojin 2000-07-26
  • 打赏
  • 举报
回复
我也用daidai 的方法试了一下,很是奇怪,文件中的东东能全部读进内存,
但是在buffer中却只能看到一部分,这是为什么,?我用的是debug时察看内存
窗口.
daidai 2000-07-26
  • 打赏
  • 举报
回复
解决了,用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;
}
}
}
U皮特U 2000-07-25
  • 打赏
  • 举报
回复
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,接下去应该明白了吧

daidai 2000-07-24
  • 打赏
  • 举报
回复
可是我要对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();
}
daidai 2000-07-24
  • 打赏
  • 举报
回复
我开始用的就是Read(),也不行.
UserReg 2000-07-24
  • 打赏
  • 举报
回复
在我的机器上运行是对的,下面是我将程序改动了一点点后,在我的机器上的运行结果:
改动程序:
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多
读取结果正确
hyzx2000 2000-07-24
  • 打赏
  • 举报
回复
Win32中,ReadHuge()已作废,请使用Read()

16,471

社区成员

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

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

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