单词转换程序是C++primer中的题。
主要使用map来存储单词转换的规则;
以及文件读写的操作,比如ifstream & ofstream & istringstream
流程:
1、生成单词转换规则,其中使用ifstream读写文件,将每一行的单词拆分开,拆分出来的单词分别存放在map的key-value对;
2、读取input文件,拆分出每一个单词,调用tranform函数,将每一个单词转换成新单词,并且将新单词写入output文件中
具体的解析在代码中:
代码如下:
#include <iostream>
#include<fstream>
#include<sstream>
#include<map>
#include<string>
using namespace std;
map<string,string> buildmap(ifstream& map_file);
string tranform(map<string,string> &word_map,string& str_old);
void word_tranform(ifstream& map_file,ifstream& input,ofstream& output);
//生成map
map<string,string> buildmap(ifstream& map_file)
{
map<string,string> word_map;
string str; //原字符串
string sub; //替换的字符串
char buffer[128];
// int flag=1;
if(map_file.is_open())
{
while(!map_file.eof())
{
map_file>>str;
map_file.getline(buffer,128);
int num=0;//空格的数目
int i;
for( i=0; i<128 && buffer[i] != '\n'; ++i)
{
if(buffer[i]==' ')
{
num++;
}
else
{
break;
}
}
for( i=0; i<128 && buffer[i]!= '\n'; ++i)
{
buffer[i]=buffer[i+num];//去空格
}
buffer[i]='\0';
sub=string(buffer);
word_map[str]=sub;//插入map中
cout<<str<<" ------ > " << sub <<endl;
}
}
return word_map;
}
//将单个字符替换成对应的字符
//返回新字符
string tranform(map<string,string> &word_map,string& str_old)
{
string str_new;
map<string,string>::iterator iter=word_map.find(str_old);
if(iter != word_map.end())//如果发现有可替换的单词
{
str_new=iter->second;
return str_new;
}
else{//没有发现有可替换的单词
return str_old;
}
}
//对整个文本进行替换
//输入参数:
//1、转换规则的输入文件流
//2、输入文件的输入文件流
//3、输出文件的输出文件流
void word_tranform(ifstream& map_file,ifstream& input,ofstream& output)
{
map<string,string> word_map=buildmap(map_file);//调用函数,建立转换规则
string str_new; //存放新的word
string str_old; //存放旧的word
char buf[128];
while(!input.eof())
{
input.getline(buf,128); //从文件流中读取一整行,存放在buf数组里
istringstream stream(buf); //stream从buf中读取,是一个istringstream对象,用来处理一行中的每一个单词
while(stream>>str_old)//stream读取到str_old中
{
str_new=tranform(word_map,str_old);//旧词替换成新的Word
output<<str_new<<" ";//写入到输出文件中
}
output<<endl;//在每一行结束后,加一个换行(保证格式要相同)
}
}
int main()
{
ifstream map_file;
map_file.open("map.txt",ifstream::in);
ifstream input;
ofstream output;
input.open("input.txt",ifstream::in);
output.open("output.txt",ofstream::out);
word_tranform(map_file,input,output);
return 0;
}