今天在干《C++ Primer》第10章的时候似乎遇到了一点小瓶颈,翻回第8章吃了顿回头草。所以,老话说得好:欠下的总是要还滴 :)
一个小程序,很简单:单词转换程序:程序输入两个文件,第一个文件包括了若干单词对,没对的第一个单词将出现在输入的字符串中,而第二个单词
则是用于输出。本质上,这个文件提供的是单词转化的集合——在遇到第一个单词时,应该将之替换为第二个单词。第二个文件则提供了与要转换的文本。
打个比方:如果单词转换文件的内容为:
而要转换的文本是:
Code:
#include <iostream> #include <map> #include <fstream> using namespace std; int main() { string fileName1("F:\\file1.txt"); //file1 string fileName2("F:\\file2.txt"); //file2 string fileName3("F:\\file3.txt"); //file3 map<string,string> trans_map; //定义map对象,存储file1的内容 string key,value; //键值对 ifstream infile; //infile提供读文件操作,读file1.txt infile.open(fileName1.c_str()); //别忘了要把文件名转化为C风格字符串! if(!infile){ cerr<<"error:enable open file:"<<fileName1<<endl; return 0; }else{ cout<<"open file:"<<fileName1<<" success"<<endl; } while(infile>>key>>value){ //将file1中的键值对读出来存放在trans_map内 trans_map.insert(make_pair(key,value)); } infile.close(); ifstream input; //input提供读文件操作,读file2.txt ofstream outfile; //outfile提供写文件操作,写入file3.txt input.open(fileName2.c_str()); if(!input){ cerr<<"error:enable open file:"<<fileName2<<endl; return 0; }else{ cout<<"open file:"<<fileName2<<" success"<<endl; } outfile.open(fileName3.c_str()); if(!outfile){ cerr<<"error:enable open file:"<<fileName3<<endl; return 0; }else{ cout<<"open file:"<<fileName3<<" success"<<endl; } string word; bool firstWord=true; //用来判断是否是第一个单词,用来处理空格的输出 while(input>>word){ //读单词(string) map<string,string>::const_iterator iter=trans_map.find(word); //如果word存在,返回指向word的迭代器 if(iter!=trans_map.end()){ word=iter->second; //迭代器是指向一个存在的元素,把word修改为file1.txt规定的对应的单词 cout<<word<<endl; //这个是输出在Console上看了玩的 } if(firstWord){ //第1个单词的情况 firstWord=false; outfile<<word; } else{ outfile<<" "<<word; //从第2个开始就要在每个单词前面输出一个空格了 } input.clear(); outfile.clear(); } outfile<<endl; return 0; }
鲁棒性有待商榷,还需要多次优化。
程序将在一个文本文件写入结果:
睡一觉再动手 :)
时间: 2024-12-28 09:00:46