/*本程序练习从一个文本文件中逐单词读出字符串,并将它们保存在一个vector<string>中,最终删除其中的
and,the,a,if ,or,but等无意义的单词,最后显示出来。
*/
#include<string>
#include<iostream>
#include<vector>
#include <fstream>
#include<algorithm>
//本来有N多错误的,加上这个fstram的头文件就好了,fstream包含iostream.以后可以用#include <fstream>来代替#include<iostream>哈
using namespace std;
//本函数从文件中读出数据,并写入到string vector中,返回 string vector
vector<string>* readandstore()
{
string file_name,text_words;
int count_words=0;
cout<<"请输入要读出的文件名"<<endl;
cin>>file_name;
ifstream infile(file_name.c_str ());
if(!infile)
{
cerr<<"打开指定文件失败"<<endl;
exit(-1);
}
vector<string>* myvector=new vector<string>;//动态建立一个string vector,避免空悬指针
while(infile>>text_words)
{
myvector->push_back (text_words);
count_words++;
}
cout<<"共有"<<count_words<<"个单词"<<endl;
infile.close ();
return myvector;
}
//本函数输出 string vector中的单词
void print(vector<string> *p)
{
vector<string>::iterator begin_iter=p->begin ();
for(;begin_iter!=p->end ();begin_iter++)
{
cout<<*begin_iter<<"/t";
}
}
//本函数从string vector 中删除一些没有意义的单词
void deletewords(vector<string> *p)
{
string sc[]={"and","the","a","if","or","but"};
int numbers=0;
vector<string>remove_words(sc,sc+6);
for(vector<string>::iterator iter=remove_words.begin ();iter!=remove_words.end ();iter++)
{
numbers=count(p->begin (),p->end (),*iter);
// 泛型算法count的使用,统计有多少个与*iter相等的单词
vector<string>::iterator flag;
flag=remove(p->begin (),p->end (),*iter);
p->erase (flag,p->end ());
cout<<"/n有"<<numbers<<"个"<<*iter<<"被删除:"<<endl;
}
}
void main()
{
vector<string> *p;
p=readandstore();
cout<<"删除以前文件内容为:"<<endl;
print(p);
deletewords(p);
cout<<"删除以后文件内容为:"<<endl;
print(p);
cout<<endl;
cout<<"删除后还有"<<p->size ()<<"个单词"<<endl;
}
/*总结:
(1)练习了对文件的输出用ifstream infile(文件名),在对文件读取的时候,string text_words;
infile>>text_words,就可将读取的单词保存到text_words了。
(2)其次练习了使用泛型算法count,remove,erase等。
(3)练习了对容器vector的使用,和对迭代器iterator的使用.
(4)明白了输入文件名的时候,必须是全路径,如:d:/ttbc.txt
(5)在读取单词的时候,首先用的是getline(getline(infile,text_words,'/t'),后面发现getline
是一次读取一行,不能对单个单词操作,即使我后面第三个参数用的是/t.
(6)让我注意到打开文件要用close来关闭。
(7)打开的文件仅局限与txt文件,打开doc和rm文件时打开失败。有空还要研究一下怎么打开其他文件。
*/