续上篇。摘自《C++Primer》10.3.9
/*
*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
*
*/
int main(int argc, char **argv)
{
//map to hold the word transformation pairs:
//key is the word to look for in the input,
//value is word to use in the output
map<string ,string> tans_map;
string key,value;
if(argc != 3)
throw runtime_error("wrong number of arguments");
//open transformation file and check that open succeeded
ifstream map_file;
if(!open_file(map_file,agrv[1]))
throw runtime_error("no transformation file");
//read the transformation map and build the map
while(map_file>>key>>value)
trans_map.insert(make_pair(key,value));
//ok,now we are ready to do the transformations
//open the input file and check that the open succeeded
ifstream input;
if(!open_file(input,agrv[2]))
throw runtime_error("no input file");
string line; //hold each line from the input
//read the next to transform it a line at a time
bool firstword = ture; //controls whether a space is printed
while(stream>>word){
//ok:the actual mapworks,this part is the heart of the program
map<string,string>::const_iterator map_it =
trans_map.find(word);
//if this word is in the transformation map
if(map_it != trans_map.end())
//replace it by the transformation value in the map
word = map_it->second;
if(firstword)
firstword = false;
else
cout<<" "; //print space between words
cout<<word;
}
cout<<endl; //done with this line of input
}
return 0;
}
其中
open_file函数
//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 failes,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
}