Example analysis of word transformation using map
- 2020-04-02 00:51:09
- OfStack
Example analysis of word transformation using map
You must use the find function when looking up words from a map, not the following table, because using subscripts in a map to access nonexistent elements will cause a new element to be added to the map container, with the key of the new element being what you are looking for.
You must use the find function when looking up words from a map, not the following table, because using subscripts in a map to access nonexistent elements will cause a new element to be added to the map container, with the key of the new element being what you are looking for.
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
}
void WordTransform(const string rule, const string infile)
{
if (rule.empty() || infile.empty())
{
return;
}
map<string ,string> trans_map;
string key, value;
// Open transformation file and check that open succeeded
ifstream map_file;
if (!open_file(map_file, rule))
{
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));
}
// Open the input file and check that the open succeeded
ifstream input;
if (!open_file(input, infile))
{
throw runtime_error("No input file.");
}
string line; // Hold each line from the input
// 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 bFirstWordFlg = 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 this word is in the transformation map
if (map_it != trans_map.end())
{
// Replace it by the transformaion value in the map
word = map_it->second;
}
if (bFirstWordFlg)
{
bFirstWordFlg = false;
}
else
{
cout << " "; // Print space between words
}
cout << word;
}
cout << endl; // Done with this line of input
}
}