您的位置:首页 > 编程语言 > C语言/C++

C++ Primer笔记 从txt文件中查找某一个单词出现的次数/行号/该行自从出现位置的内容

2012-12-05 17:20 330 查看
p379
这里有个bug:需求是找出现的次数,当某行出现次数多于一次时,这个程序得到的就是一共出现在了多少行,
下面的运行结果为5次,实际element出现多过5次,只是出现在5行而已,所以这是个bug!

#pragma warning(disable: 4786)
#pragma warning(disable: 4503)
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <map>
#include <vector>
using namespace std;

//用来显示查找的该单词所在行的部分内容
void Show(vector<string>::const_iterator beg, vector<string>::const_iterator end)
{
while (beg != end)
{
cout<<*beg++<<" ";
}
}

int main()
{
ifstream infile("1.txt", ios::in);
if (!infile)
{
cerr<<"open file error!"<<endl;
exit(1);
}

string str;
unsigned int line = 0; //记录行号
string strFind("element"); //待查单词
map< unsigned int, vector<string> > element; //保存待查元素行号,每行部分内容
bool enter = false; //当某一行出现了待查元素后开始记录该行内容

while(getline(infile, str)) //读入一行至str
{
enter = false;
++ line;
istringstream stream(str); //用来从独到的一行内容中逐个取出单词
string word; //记录每行中的单独的每个单词
vector<string> sentence; //保存出现待查元素后该行的内容
while (stream >> word) //取出每行中每个单词
{
if (strFind == word) //是否为待查单词
{
enter = true;
}
if (true == enter) //开始记录待查单词所在行的内容
{
sentence.push_back(word);
}
}
if (true == enter)
{
element.insert(make_pair(line, sentence)); //把行号和内容保存起来
}
}

cout<<strFind<<"总共出现"<<element.size()<<"次!"<<endl;

for (map< unsigned int, vector<string> >::const_iterator iter = element.begin(); iter != element.end(); iter ++)
{
cout<<"第"<<iter->first<<"行: ";
Show((iter->second).begin(), (iter->second).end());
cout<<endl;
}

cout<<endl;
return 0;
}

1.txt和运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐