需求:
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++笔记 -- 整型数据与字符类型详解 #### 整型数据 整型数据在C++中占据着非常重要的地位,它们用于表示没有小数部分的数值。C++支持多种类型的整型数据,包括有符号整型和无符号整型。 ##### 1. **有符号...
C++是一种静态类型、编译式、通用的编程语言,它支持过程化编程、面向对象编程和泛型编程。C++广泛应用于软件开发领域,包括操作...以上内容覆盖了C++语言中一些基础知识点,对于学习和理解C++编程具有重要的指导意义。
本资源包含的是Visual C++程序设计的学习笔记,涵盖了从基础到进阶的12个章节的源代码,对于学习和理解C++编程,特别是使用Visual C++环境编程,具有极高的参考价值。 首先,我们来详细探讨一下Visual C++的关键...
这篇学习笔记主要涉及了C++编程的一些核心概念,包括程序结构、变量、基本类型、初始化与赋值、可读性、常量与引用、typedef、枚举以及标准库中的字符串和向量类型。 1. **程序结构**: - 每个C++程序都必须包含`...
### Visual C++学习笔记知识点详解 #### 1. Win32API详解 Win32API是微软为其32位平台提供的应用程序编程接口(Application Programming Interface),适用于所有基于Win32平台运行的应用程序。通过调用Win32 API中...
C++程序结构的知识点涵盖了从源代码到可执行程序的整个编译过程,以及C++程序的基础架构和入口函数main()的具体用法。以下详细知识点: 1. C++程序的编译过程: C++的编译过程通常包括预处理、编译、链接三个阶段。...
根据提供的文件信息,本文将对C++中容易混淆的部分进行详细的解析与说明,旨在帮助读者更好地理解并记忆这些重要的概念。 ### C++基础知识回顾 C++是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的...
4. 编辑:使用文本编辑工具编写C++程序 5. 编译:用编译器源代码转换为主机使用的内部语言 6. 链接:将若干个目标代码和现有的二进制代码库经过链接器连接,产生可执行代码 C++语言是一门功能强大且灵活的程序设计...
### C++ 学习笔记知识点总结 #### 一、C++世界地图 - **平台环境**:介绍 C++ 在不同操作系统中的应用情况,主要提到了 Windows、Linux 和嵌入式系统这三个主流领域。 #### 二、C++旅行世界必备物品 - **1. C++...
"C++技能百练 C++学习笔记 C经典程序100练"这个资源针对初学者提供了丰富的实践机会,旨在帮助他们通过实例来深入理解C++的核心概念。以下是这份资料中可能涵盖的一些关键知识点: 1. **基础语法**:包括变量、数据...
本学习笔记将深入探讨C++的基础、核心概念以及高级特性,帮助读者从初学者到熟练掌握C++。 一、C++基础 C++的基础包括基本语法、数据类型、变量、运算符、流程控制(如if语句、switch语句、for循环、while循环)和...
C-C++基础学习笔记是编程初学者的重要参考资料,它们涵盖了C和C++语言的基本概念、语法和编程技巧。以下是对这些知识点的详细说明: 1. **C语言基础**:C语言是一门强大的低级编程语言,它以简洁、高效著称。学习...
### Python学习笔记知识点总结 #### 一、Python简介与特点 **Python**是一种新兴的、免费的、解释型的、可移植的、开放源代码的脚本编程语言。它不仅适用于快速开发简单脚本,也适合开发复杂的应用程序。Python...
- C++与数据库的连接,通常通过ODBC或MySQL Connector/C++等接口实现,学习如何执行SQL查询和处理结果集。 12. **图形界面编程(qt)**: - Qt库是用于创建跨平台GUI应用的,学习如何使用Qt Creator设计界面,...
为了能使读者通过读懂源代码来掌握Visual C++技术,在实例举证时还给源代码绘了大量的流程图,采取学习笔记的写作方式将 Visual C++开发技术展现得淋漓尽致,能使读者很快地进入实际开发角色。本书和市场上其他类似...
《C++视频教程-VC深入详解自学笔记》是一份全面且免费的学习资源,旨在帮助初学者和有一定基础的开发者深入理解C++编程语言,特别是通过Visual C++ (VC++)这一开发环境进行实践。教程由孙鑫整理,涵盖了从基础到高级...