求一段C++小程序
发布网友
发布时间:2023-07-07 20:54
我来回答
共4个回答
热心网友
时间:2024-11-17 16:34
while(getline(inf, strLine))
{
if(strLine.size() > 0)
strContent += strLine;
} 中strContent += strLine;是什么意思?谢谢!
strLine是html文档中的每一行,这句的意思是每读取一行就把它加入到strContent中,遇到空行不加入,这样可以不遗漏因转行而本分开的关键字。
我改了下,从书上抄了个case-insensitive的字符串traits,这样查找关键字就不分大小写了,有点理解你的意思了,你的意思是把多个html页面代码放在一个文本中,然后先在第1个页面的标题里找,找到的话count++,如果第1个页面的网页部分也有的话count就不增加,也就是说在同一个网页段(header 加 body)里如果关键字出现就只算一次是不是?
#pragma warning (disable: 4996) // 太多警告看着厌烦无视之
#include <iostream>
#include <fstream>
#include <string>
#include <cstddef>
#include <cstring>
#include <utility>
#include <map>
using namespace std;
struct ci_char_traits : public char_traits<char>
{
static bool eq(char c1, char c2)
{
return toupper(c1) == toupper(c2);
}
static bool lt(char c1, char c2)
{
return toupper(c1) < toupper(c2);
}
static int compare(const char* s1, const char* s2, size_t n)
{
return memicmp( s1, s2, n );
}
static const char* find(const char* s, int n, char a)
{
while( n-- > 0 && toupper(*s) != toupper(a) )
{
++s;
}
return n >= 0 ? s : 0;
}
};
typedef basic_string<char, ci_char_traits> ci_string;
istream& getline(istream& is, ci_string& cistr)
{
string temp;
getline(is, temp);
cistr = temp.c_str();
return is;
}
ostream& operator << (ostream& os, const ci_string& cistr)
{
os << cistr.c_str();
return os;
}
typedef const char* PCSTR;
bool SearchDetail(const ci_string& src, const ci_string& key)
{
//size_t uiCount = 0;
//size_t uiPrevPos = 0;
//size_t szLength = key.size();
//while((uiPrevPos = src.find(key, uiPrevPos)) != ci_string::npos)
//{
// ++uiCount;
// uiPrevPos += szLength;
//}
//return uiCount;
return src.find(key) != string::npos;
}
size_t KeyWordSearch(PCSTR szFileName, PCSTR szKeyWord)
{
ifstream inf(szFileName);
if(!inf)
{
cout << "File: " << szFileName << " not exist!\n";
return 0;
}
ci_string strContent;
ci_string strLine;
while(getline(inf, strLine))
{
if(strLine.size() > 0)
strContent += strLine;
}
size_t iHeadBeg;
size_t iCount = 0;
while((iHeadBeg = strContent.find("<H")) != string::npos)
{
size_t iHeadEnd = strContent.find("</H");
iHeadEnd = strContent.find(">", iHeadEnd) + 1;
// 把Header提取出来, 从总篇幅中删除
ci_string strHeader(strContent.begin() + iHeadBeg, strContent.begin() + iHeadEnd);
strContent.erase(strContent.begin() + iHeadBeg, strContent.begin() + iHeadEnd);
// size_t iCountHeader = SearchDetail(strHeader, ci_string(szKeyWord));
// 看是否存在
bool bInHeader = SearchDetail(strHeader, ci_string(szKeyWord));
// 定位Body
size_t iNextHeader = strContent.find("<H");
if(iNextHeader == string::npos)
iNextHeader = strContent.size();
// 把Body提取出来, 从总篇幅中删除
ci_string strBody(strContent.begin(), strContent.begin() + iNextHeader);
strContent.erase(strContent.begin(), strContent.begin() + iNextHeader);
// size_t iCountBody = SearchDetail(strBody, ci_string(szKeyWord));
// 看是否存在
bool bInBody = SearchDetail(strBody, ci_string(szKeyWord));
iCount += (bInHeader || bInBody);
}
return iCount;
}
int main()
{
cout << "Enter a file's name (include complete directory):\n";
ci_string strFileName;
getline(cin, strFileName);
cout << "Enter the keyword you want to search for:\n";
ci_string strKeyWord;
getline(cin, strKeyWord);
size_t iResult(KeyWordSearch(strFileName.c_str(), strKeyWord.c_str()));
cout << "The times of occurrence of keyword \"" << strKeyWord << "\" is: ";
cout << iResult << endl;
}
热心网友
时间:2024-11-17 16:34
以前做过类似的题,不过当时是简单处理,忽略<>中间的内容
热心网友
时间:2024-11-17 16:35
bust
破产的;一文不名的
be clean [dead] bust(穷得)一文不名
you are bust-you are bust
你破产了
sorry to trouble you
抱歉麻烦你
热心网友
时间:2024-11-17 16:36
正学着html语言呢,。。。。。。。