c++ primer 习题之 单词转换程序

写在前面  以下程序代码均已内测执行并参考答案   但测试数据不多  正所谓当局则迷   如有错误及建议  欢迎大侠们指点出来

  

//单词转换程序.cpp 

/*
a program to transform words.
Takes two arguments:The first is name  of the word transformation file ,
The second is name of the input to transform
*/



#include <iostream>
#include <fstream>
#include <sstream> 
#include <map>
#include <string>
#include <stdexcept>
#include <utility>


using namespace std;


// opens in binding it to the given file
ifstream& open_file(ifstream &in, const string &file)
{
        in.close();     // close in case it was already open
        in.clear();     // clear any existing errors
        // if the open fails, the stream will be in an invalid state
        in.open(file.c_str()); // open the file we were given
        return in; // condition state is good if open succeeded
}


int main(int argc,char* argv[3])
{

//map to hold the word transformation pairs;
//key is the word to look for in the input ;valu is word to use in the output
map <string, string> trans_map;
string key, value;



if(argc != 3)
throw runtime_error("wrong numeber of arguments!");

//open transformation map and build the map
ifstream map_file;
if( !open_file (map_file,argv[1]) )
throw runtime_error("no transformation!");
//read transformation map and build the map
while(map_file >> key >> value)
{
pair <string,string> make(key, value);
trans_map.insert(make);
}
//ok,now we are ready to do the transformations;
//open the input file and check that the open succeded;

ifstream input; 
if( !open_file (input, argv[2]) )
throw runtime_error("no input file!");
string line;
//read the text to transform it a line at a time
while (getline (input, line) )
{
istringstream stream(line); //read the line a word at a time
string word;
bool firstword = true;     //controls whether a space is printed
while (stream >> word)
{
//ok: the actual mapwork,this part is the heart of the program
map <string, string>::const_iterator map_it = trans_map.find(word);

//if the word is in the transfomation map;
if ( map_it != trans_map.end() )
//repalce it by the transformation value in the map
word = map_it->second;
if (firstword)
firstword = false;
else
cout << "\t" ; //print a space between words
cout << word;     //print the updated word 
}
cout << endl;
}
return EXIT_SUCCESS;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值