如何在文件中查找某一字符串的个数 有一个文件里面有中文有英文我想在此文件中查找某一个字符串的个数CFile file(TRUE, "test.txt");然后该怎么做~~~~??? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 假设需要查找的字符串为 szNeedFindint nlen = strlen(szNeedFind);FILE* fp = fopen("test.txt", "r");char szBuffer[256]; char ch; int iCount = 0;strcpy(szBuffer, "");while(!feof(fp)){ if( fread(fp, 1, 1, &ch) != 1) break; else { memmove(szBuffer, szBuffer+1, nlen-1); strcat(szBuffer, &ch); if( strcmp(szBuffer, szNeedFind) == 0 ) iCount ++; }}fclose(fp); 用CString 的 .Find 做个标志 位 to: biliangxia(天下无双)如果文件比较大,你每次只能从256个字符中查找。如果这个256个字符的最后几个字符正好是我要查找的字符的前几位。这样,查询出来的结果就会少于实际结果。 把文件映射一下,当成内存用CreateFileMapping( HANDLE hFile, LPSECURITY_ATTRIBUTES lpAttributes, DWORD flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCTSTR lpName);LPVOID MapViewOfFile( HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap); 把文件读给一个CString,然后用CString的find很容易啊。CString fileStr,findStr;.....//读文件到fileStr,给findStr赋值int i=0,count=0;while(( i=fileStr.Find(findStr,i)) > 0) count++;但是有个问题,如果你要找的那个字符串正好处在2行的话,比如:文件:dfsfus9fj342abcjisjfisabc要找的字符串:abc这时候查找结果是1,因为有一个abc在第一行尾和第二行初,中间实际有一个回车,所以查不到。如果你只处理字符串的话,就先删除点fileStr里面的所有回车,然后再找 int findstrcount(CString, filename, CString findstr){ CString strfile; CFile fp; CFileException fe; // 打开文件 if (!fp.Open(filename, CFile::modeRead, &fe)) { AfxMessageBox("打开文件失败!"); return FALSE; } // 将文件读入到strfile long dwLength = 0; dwLength = fp.GetLength(); TCHAR *pBuf = new TCHAR[dwLength]; memset(pBuf, 0, sizeof(TCHAR) * dwLength); UINT nBytesRead = fp.Read(pBuf, dwLength); strfile = pBuf; fp.Close(); delete [] pBuf; strfile = strfile.Left(dwLength); // 查找字符串 findstr int pos = 0, int pos1; int count = 0; while ((pos1=strfile.Find(findstr, pos)) != -1) { // 找到一个, 计数加1 count++; pos = pos1 + findstr.GetLength(); } return count;} 作文件影射,然后用字符串的查找匹配函数如果单纯只是txt查找,那么可以用系统的findstr命令,然后用管道获得输出 谢谢各位。我就是每次读1K到CString里。然后在这个刚读入的CString里Find。可是得出来的结果跟实际结果不一样。因为有的字符串正好处于1K的边缘。junhuang09() 给的最正确。 使用CFileDialog能否设置工作路径? VS SQL Server 程序移植 不用菜单按钮,怎么给工具栏按钮直接添加消息?? 如何把含有中文字符的string类型转换为Cstring类型 还是关于绘制 怎样通过程序改变group box的CAPTION? 如何能在CScrollView上画图时不闪烁 请高手给我一个建议(绝对给分!) 编译出错,什么原因?怎么解决? 请问智能指针实例化的问题 对话框模式下创建弹出式菜单的问题请教! 谁知道在VC中如何判断光驱中有无光盘?
int nlen = strlen(szNeedFind);
FILE* fp = fopen("test.txt", "r");
char szBuffer[256]; char ch; int iCount = 0;
strcpy(szBuffer, "");
while(!feof(fp))
{
if( fread(fp, 1, 1, &ch) != 1) break;
else
{
memmove(szBuffer, szBuffer+1, nlen-1);
strcat(szBuffer, &ch);
if( strcmp(szBuffer, szNeedFind) == 0 )
iCount ++;
}
}
fclose(fp);
HANDLE hFile,
LPSECURITY_ATTRIBUTES lpAttributes,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
LPCTSTR lpName
);LPVOID MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
SIZE_T dwNumberOfBytesToMap
);
CString fileStr,findStr;
.....//读文件到fileStr,给findStr赋值
int i=0,count=0;
while(( i=fileStr.Find(findStr,i)) > 0)
count++;
但是有个问题,如果你要找的那个字符串正好处在2行的话,比如:
文件:
dfsfus9fj342ab
cjisjfisabc
要找的字符串:abc
这时候查找结果是1,因为有一个abc在第一行尾和第二行初,中间实际有一个回车,所以查不到。如果你只处理字符串的话,就先删除点fileStr里面的所有回车,然后再找
int findstrcount(CString, filename, CString findstr)
{
CString strfile;
CFile fp;
CFileException fe;
// 打开文件
if (!fp.Open(filename, CFile::modeRead, &fe))
{
AfxMessageBox("打开文件失败!");
return FALSE;
} // 将文件读入到strfile
long dwLength = 0;
dwLength = fp.GetLength(); TCHAR *pBuf = new TCHAR[dwLength];
memset(pBuf, 0, sizeof(TCHAR) * dwLength);
UINT nBytesRead = fp.Read(pBuf, dwLength);
strfile = pBuf;
fp.Close();
delete [] pBuf; strfile = strfile.Left(dwLength); // 查找字符串 findstr
int pos = 0,
int pos1;
int count = 0;
while ((pos1=strfile.Find(findstr, pos)) != -1)
{
// 找到一个, 计数加1
count++;
pos = pos1 + findstr.GetLength();
} return count;
}
如果单纯只是txt查找,那么可以用系统的findstr命令,然后用管道获得输出
我就是每次读1K到CString里。
然后在这个刚读入的CString里Find。
可是得出来的结果跟实际结果不一样。因为有的字符串正好处于1K的边缘。junhuang09() 给的最正确。