ReadHuge?Cstring有大小限制? Win32中,ReadHuge()已作废,请使用Read() 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我开始用的就是Read(),也不行. 在我的机器上运行是对的,下面是我将程序改动了一点点后,在我的机器上的运行结果:改动程序: 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多读取结果正确 可是我要对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();} 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 的方法试了一下,很是奇怪,文件中的东东能全部读进内存,但是在buffer中却只能看到一部分,这是为什么,?我用的是debug时察看内存窗口. CString显示时不会把所有的东东都显示出来,只有用看内存的方式才能看见全部的信息.以前我也遇到这个问题. 我也做过从一个HTML中找特定的字串的程序.当然是自己用着玩:)不过我没有一次读入所有的字串,我用了CArchive,一次读一行,在CString里进行查行,有兴趣的话你也可以试试. 回答guojin的问题; debug显示CString 或 LPSTR等时,显示到第一个 0x00即中止, C中字符串以 0x00 结尾,即使你的 string buffer中后面还有数据, debug也不显示, 谢谢Tiangz兄.buffer是字符数组,非CString.我又看了buffer中显示的数据的附近没有0x00!可能不是这个问题.在file.Read()前得到的文件的长度为5888字节,file.Read()后返回的读到buffer中得个数也为5888.我于是又把buffer中的东东,写到另外一个文件中去,哈哈,果然成功了.第二个文件与第一个文件一模一样!!!得到的结论是:debug时,有可能为了不过分占据桌面窗口,对于过分长的字符串,只显示其中的一部分! 解决了,用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; } }} 新人求绘图方向~~~ 求高手指点ARPSPOOF程序代码段中的错误!!!急 关于Groupbox边线四角变圆的问题! 关于dll调用对话框产生的异常 请帮忙看看 用IActiveDesktop SetWallpaper无法更桌面,为什么? <<<<<<<<<极蠢的问题>>>>>>>>>---谁解决则俩百分送上 在线等待 怎样把字符串"a",转换为字符'a'? 大家有没有发现VS2010——MFC的对话框有个显示BUG? 如何画表格 关于CSocket的疑问 怎样让CListCtrl的Item可以被编辑
改动程序:
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多
读取结果正确
我是要把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();
}
string1=">";
string2="<"
oldfile="aa<1234>bb";
执行完第一句后,newfile="aa<1234"
此时newfile.Find(..)返回值为2,接下去应该明白了吧
但是在buffer中却只能看到一部分,这是为什么,?我用的是debug时察看内存
窗口.
以前我也遇到这个问题.
不过我没有一次读入所有的字串,我用了CArchive,一次读一行,在CString里进行查行,
有兴趣的话你也可以试试.
debug显示CString 或 LPSTR等时,显示到第一个 0x00即中止,
C中字符串以 0x00 结尾,即使你的 string buffer中后面还有数据,
debug也不显示,
buffer是字符数组,非CString.我又看了buffer中显示的数据的附近
没有0x00!可能不是这个问题.
在file.Read()前得到的文件的长度为5888字节,file.Read()后返回
的读到buffer中得个数也为5888.
我于是又把buffer中的东东,写到另外一个文件中去,哈哈,果然成功了
.第二个文件与第一个文件一模一样!!!
得到的结论是:debug时,有可能为了不过分占据桌面窗口,对于过分长的
字符串,只显示其中的一部分!
中所有文件名,为什么只能得到最多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;
}
}
}