c++学习笔记-文本查询程序
来源:互联网 发布:驱蚊草 知乎 编辑:程序博客网 时间:2024/06/05 00:30
需求:
1. 打开需要查询的文本文件,将文件的内容以行的方式读出并保存起来,需要记录行号和对应的文本。
2. 把每一行以单词进行拆分,把每个单词及该单词出现的行号记录起来,一个单词可能出现在多行。
3. 处理单词查询功能,返回指定单词出现在文本中的所有行号集合。
4. 遍历得出的行号集合,根据行号从1中返回对应下标的文本。
数据结构
1. 把文本内容保存到一个vector容器对象中,每一行就是vector的一个元素,行号对应于元素的下标。
2. 每个单词所在的行号保存到一个set容器对象中。
3. 把每个单词和其所在的行号关联起来,保存到map容器对象中。
下面是源码实现,包含三个文件,TextQuery.h,TextQuery.cpp,Client.cpp。
TextQuery.h
#ifndef TEXT_QUERY_H #define TEXT_QUERY_H #include <vector> #include <map> #include <string> #include <set> #include <fstream> using namespace std; class TextQuery { public: typedef vector<string>::size_type lineNo; void readFile(ifstream &is); set<lineNo> queryWordLineNos(const string &word) const; string getText(lineNo num) const; private: void storeFile(ifstream &is); void buildMap(); vector<string> linesText; map< string,set<lineNo> > wordMap; }; #endif
TextQuery.cpp
#include <sstream> #include "TextQuery.h" void TextQuery::storeFile(ifstream &is) { string textLine; while(getline(is,textLine)) linesText.push_back(textLine); } void TextQuery::buildMap() { for(lineNo num = 0; num < linesText.size(); ++num) { istringstream lineStream(linesText[num]); string word; while(lineStream >> word) wordMap[word].insert(num); } } void TextQuery::readFile(ifstream &is) { storeFile(is); buildMap(); } set<TextQuery::lineNo> TextQuery::queryWordLineNos(const string &word) const { map< string,set<lineNo> >::const_iterator cit = wordMap.find(word); if(cit == wordMap.end()) return set<lineNo>(); else return cit->second; } string TextQuery::getText(lineNo num) const { if(num < linesText.size()) return linesText[num]; else throw out_of_range("lineNo out of range"); }
Client.cpp
#include <iostream> #include "TextQuery.h" ifstream& openFile(ifstream &is,const string &fileName) { is.close(); is.clear(); is.open(fileName.c_str()); return is; } int main(int argc,char **argv) { if(argc != 2) throw runtime_error("arguments error"); ifstream is; if(!openFile(is,argv[1])) throw runtime_error("open file error"); TextQuery tq; tq.readFile(is); while(true) { cout << "please input word:" << endl; string word; cin >> word; if(!cin || word == "quit") { cout << "bye" << endl; break; } set<TextQuery::lineNo> lineNos = tq.queryWordLineNos(word); cout << "fount lines:" << lineNos.size() << endl; set<TextQuery::lineNo>::iterator it = lineNos.begin(); while(it != lineNos.end()) { cout << "(" << *it + 1 << ")" << " " << tq.getText(*it) << endl; ++it; } } return 0; }
text.txt内容:
my name is alexzhou
hello word
my name
is alexzhou
welcome here
welcome beijing
vs2010: 在项目属性里面 配置属性-》调试-》命令参数 里面写上参数:e:\\text.txt 。
程序运行结果如图:
转载请注明来自:Alex Zhou,本文链接:http://codingnow.cn/c-c/637.html
- C++Primer 【笔记】文本查询程序 TextQuery
- C++primer学习:文本查询程序
- c++学习笔记-文本查询程序
- c++学习笔记:文本查询程序
- 文本查询程序--摘自c++primer
- 【足迹C++primer】41、文本查询程序
- 【足迹C++primer】56、文本查询程序
- 文本查询程序(C++primer5th)
- C++primer学习:面向对象程序设计(5):再探文本查询程序
- 【C++ Primer】【学习笔记】【第十章】关联容器之:文本查询程序
- c程序学习笔记
- 简单文本查询程序
- 文本查询程序
- 感悟:文本查询程序
- 文本查询程序
- 文本查询程序
- 文本查询程序
- 文本查询程序
- Who Gets the Most Candies?----POJ_2886----线段树之单点更新
- 使用 HibernateTemplate 实现分页查询
- Spring Hibernate 模板实现分页
- linux 学习笔记二
- HTML5新标签语义及用法
- c++学习笔记-文本查询程序
- 传统软件向SaaS软件转型方案的研究
- Java类型转换
- 游戏设计中常用的设计模式
- 开发iOS即时通讯工具参考的一些开源、框架和教程
- poj3468~线段树成段更新求和
- Android 重写WebViewClient,加载完之前弹出 progressBar
- 创新工场2013年笔试题(三)丑陋数
- 一个老程序员的总结