首先,我们要了解Primer文本查询程序的基本思路。该程序能够读取一个文本文件,并且能够响应用户的查询请求,返回文本文件中包含指定单词的所有行。
具体实现方式如下:
- 读取文本文件
可以使用C++标准库中的fstream库来读取文本文件。通过创建一个fstream对象,并且设置打开文件的方式为ifstream::in,则可以打开文件进行读取。
示例代码如下:
std::ifstream ifs("file.txt", std::ifstream::in);
if (!ifs) {
std::cerr << "Failed to open file" << std::endl;
return 1;
}
std::string line;
while (std::getline(ifs, line)) {
std::cout << line << std::endl;
}
上述代码读取了名为"file.txt"的文本文件,并且将其中的每一行输出到控制台上。
- 解析文本文件,构建数据结构
在读取文本文件之后,需要对文件进行解析,并且构建一个数据结构,以便于后续的查询。
可以使用C++标准库中的STL容器,例如vector、map等来实现数据结构。其中,vector用于存储每一行的文本内容,map用于存储单词及其在文本文件中出现的所有行数。
示例代码如下:
std::vector<std::string> lines;
std::map<std::string, std::set<int>> wordLines;
std::string line;
int lineNum = 0;
while (std::getline(ifs, line)) {
// 存储每一行的文本内容
lines.push_back(line);
// 解析行,并将单词及其出现的行数存储到容器中
std::istringstream iss(line);
std::string word;
while (iss >> word) {
wordLines[word].insert(lineNum);
}
++lineNum;
}
上述代码将读取到的每一行存储到了名为"lines"的vector容器中,同时解析每一行,并将单词及其出现的行数存储到名为"wordLines"的map容器中,其中set用于存储出现行数的集合。
- 支持用户查询请求
在解析完文本文件之后,程序需要能够响应用户的查询请求。用户可以输入一个单词(或者多个单词,例如"hello world"),程序需要返回包含这个单词的所有行。
可以使用C++标准库中的算法,例如find函数、count函数、set_intersection函数等来实现查询功能。
示例代码如下:
std::string query;
std::cout << "Please enter a word to query:" << std::endl;
while (std::cin >> query) {
std::set<int> lineNums;
// 查询单词在文本文件中出现的行数
auto it = wordLines.find(query);
if (it != wordLines.end()) {
lineNums = it->second;
}
// 输出包含单词的所有行
std::cout << "The word \"" << query << "\" occurs " << lineNums.size() << " times." << std::endl;
for (auto lineNum : lineNums) {
std::cout << "\t(line " << lineNum << ") " << lines[lineNum] << std::endl;
}
}
上述代码中,程序通过读取用户输入的单词,并且使用set容器来保存包含这个单词的所有行号,最后输出所有包含该单词的行。
综上所述,实现一个完整的Primer文本查询程序,需要完成文本文件的读取、数据结构的构建、查询功能的实现等多个部分。通过上述示例代码,读者可以初步了解到如何实现这些部分。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++详解Primer文本查询程序的实现 - Python技术站