关于CString的Find函数

acwinder 2010-11-30 05:06:25
在一个txt文档中,查找指定字符串,文档中该字符串明明存在,在调用函数后返回值为-1,这是为什么?
...全文
261 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
acwinder 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 lazy_2010 的回复:]
to 楼主:CStringA 的 +=(const char *) 操作符,假定后面的字符串是以 ASCII 0 结束的;对于你的情况,可以预料

1、执行之后,实际上把后面的其它非 0 字符加入到 finalbuffer 中了,

2、遇到大于 0x80 的字符,与 html 中 >= 0x40 的字符被 Find 函数合并处理当成中文了,所以,某些字符串找不到了
[/Quote]
非常感谢耐心解答!
lazy_2010 2010-12-01
  • 打赏
  • 举报
回复
不好意思,刚才第三条不准确,还需要做的是修改 finalbuffer += buffer,
修改成 finalbuffer += CStringA(buffer, dwBytesRead); 之后;这样做呢,第 2 条可以不做。
lazy_2010 2010-12-01
  • 打赏
  • 举报
回复
1、使用 CStringA 说明已经使用了 MBCS;

2、buffer 应当分配成 32K + 1 个字节的空间,在读取之后,

buffer[dwBytesRead] = '\0';

避免缓冲区没有正常结束。

3、如果使用 find 还没有找到,可能是文件中包含了 ASCII 字符 0,有的 html 文件包含了这样的字符但是能够显示;你可以尝试输出 strlen((LPCSTR)finalbuffer) 和 finalbuffer.GetLength() 看着两个数据是否相同。
youhao1999 2010-12-01
  • 打赏
  • 举报
回复
do
{
memset(buffer, 0, sizeof(buffer));
ReadFile(hFile, buffer, 32*1024, &dwBytesRead, NULL);
finalbuffer += buffer;
}
while(dwBytesRead);
youhao1999 2010-12-01
  • 打赏
  • 举报
回复
weewewwew
youhao1999 2010-12-01
  • 打赏
  • 举报
回复
bob_2T2 2010-12-01
  • 打赏
  • 举报
回复
编码问题,unicode 或ansi,建议使用多字节字符集。
acwinder 2010-12-01
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 lazy_2010 的回复:]
如果文件大于 32K ,就会出现问题
[/Quote]
是因为buffer设置的大小问题吗
acwinder 2010-12-01
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 lazy_2010 的回复:]
C/C++ code

do
{
memset(buffer, 0, sizeof(buffer));
ReadFile(hFile, buffer, 32*1024, &dwBytesRead, NULL);
finalbuffer += buffer;
}while(dwBytesRead);



这里循环是怎么回事情?
[/Quote]
循环读,读完为止,一次buffer读不完
lazy_2010 2010-12-01
  • 打赏
  • 举报
回复
如果文件大于 32K ,就会出现问题
lazy_2010 2010-12-01
  • 打赏
  • 举报
回复

do
{
memset(buffer, 0, sizeof(buffer));
ReadFile(hFile, buffer, 32*1024, &dwBytesRead, NULL);
finalbuffer += buffer;
}while(dwBytesRead);

这里循环是怎么回事情?

acwinder 2010-12-01
  • 打赏
  • 举报
回复
第一次贴代码,有点问题,各位大虾见谅
acwinder 2010-12-01
  • 打赏
  • 举报
回复

char buffer[32*1024]; //接收缓冲区
CStringA finalbuffer = "";
DWORD dwBytesRead;

HANDLE hFile = CreateFile(_T("\\1.htm"), //打开1.htm
GENERIC_READ, //为读取而打开
FILE_SHARE_READ, //共享读取
NULL, //没有安全设置
OPEN_EXISTING, //打开仅存在的文件
FILE_ATTRIBUTE_NORMAL, //正常属性
NULL); //没有模板文件

if(hFile == INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("打开失败"));
return 0;
}

do
{
memset(buffer, 0, sizeof(buffer));
ReadFile(hFile, buffer, 32*1024, &dwBytesRead, NULL);
finalbuffer += buffer;
}
while(dwBytesRead);

CloseHandle(hFile);
字符串是从1.htm中读出来的最后存到finalbuffer里,从finalbuffer中查找指定字符串,会不会是后面有字符串没有读出来,帮忙分析分析代码
Nov_c 2010-12-01
  • 打赏
  • 举报
回复
有可能是起始位置或者是字符集问题吧
lazy_2010 2010-12-01
  • 打赏
  • 举报
回复
to 楼主:CStringA 的 +=(const char *) 操作符,假定后面的字符串是以 ASCII 0 结束的;对于你的情况,可以预料

1、执行之后,实际上把后面的其它非 0 字符加入到 finalbuffer 中了,

2、遇到大于 0x80 的字符,与 html 中 >= 0x40 的字符被 Find 函数合并处理当成中文了,所以,某些字符串找不到了
acwinder 2010-12-01
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 lazy_2010 的回复:]
1、使用 CStringA 说明已经使用了 MBCS;

2、buffer 应当分配成 32K + 1 个字节的空间,在读取之后,

buffer[dwBytesRead] = '\0';

避免缓冲区没有正常结束。

3、如果使用 find 还没有找到,可能是文件中包含了 ASCII 字符 0,有的 html 文件包含了这样的字符但是能够显示;你可以尝试输出 strlen((LP……
[/Quote]
非常感谢lazy的解答,把buffer加一个后这个问题得到了解决,能告诉我这样做的原因吗?
青稞 2010-11-30
  • 打赏
  • 举报
回复
把代码贴出来。。才好分析原因
手机写程序 2010-11-30
  • 打赏
  • 举报
回复
应该是unicode和ansi的问题.
蒙飞鸿 2010-11-30
  • 打赏
  • 举报
回复
至少说下调用的哪个函数嘛。。。
whrspsoft3723 2010-11-30
  • 打赏
  • 举报
回复
查找的串也用cstring试下。
不会是编码集的问题吧。
加载更多回复(8)

16,467

社区成员

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

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

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