这篇代码有几个知识点可以复习一下,而且小白学到了新知识o(╯□╰)o
 #include <iostream>
#include <string>
#include <map>
#include <fstream>
#include <sstream>
using namespace std; ifstream& open_file(ifstream&,const string&);
/*two input main parameter of main:
*The first is name of the word transformation file
*The second is name of the input to transform
*/
int main(int argc, char **argv )
{
/*Use to hold the pair of word and trans_word:
Key is the word to look for in the input, Value is the word to use in the output
*/
map<string, string> trans_map;
string key, value;
if(argc != )
throw runtime_error("Wrong number of arguments!");
ifstream map_file;
if (!open_file(map_file, argv[]))
{
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)); ifstream input;
if(!open_file(input, argv[]))
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)) //read a line from the input to line
{
istringstream stream(line);
string word;
bool firstword = true;
while (stream >>word)
{
/*Use word find the key of trans_map*/
map<string, string>::const_iterator map_it = trans_map.find(word);
if (map_it !=trans_map.end())
/*if there is substitute for word, change the word*/
word = map_it->second;
if (firstword)
firstword = false;
else
cout << " ";
cout << word;
}
cout << endl;
}
return ;
} ifstream& open_file(ifstream &in, const string &file )
{
in.close();
in.clear();
in.open ( file.c_str() );//open the file we were given
return in;
}

首先理清楚单词转换的流程:

1.明确输入文件有两个:
  ①mapfile,单词转换集合,其第一个值为待转换单词,第二个值为转换后单词
  ②infile,输入文件
2.明确对文件的操作
  ①对于mapfile,如果打开正确的话,读入单词转换对,将其转化为:第一个值为key,第二个值为value;调用insert在容器中插入新元素,循环执行。
  ②对于infile,使用getline函数逐行读取文件,将文件的每个单词在map_file中查找,若找到则用map_file中的value将其替代,最后输出。注:输出空格的细节! 

知识点总结:

1.main函数的形参

main(int argc, char **argv);

argc是一个整型变量,指的是命令行输入参数的个数,argv是字符串数组,它包含argc个字符串,每个字符串存储着一个命令行参数,其也可以写作char *argv[]。

如该例子argv[0]存储的是命令名,argv[1],argv[2]存储着执行该程序所需要的两个文件名参数。

argc和argv就是一个名字,可以改变的,如写成arc和arv,丝毫不影响。

对形参个数的检查:

if(argc != )
  throw runtime_error("Wrong number of arguments!");

2.文件打开

ifstream& open_file(ifstream &in, const string &file )
{
in.close();
in.clear();
in.open ( file.c_str() );//open the file we were given
return in;
}

输入的两个参数:文件流和文件名

最后要么将in和指定文件绑在了一起,要么处于错误条件状态。

错误使用throw runtime_error

3.文件读取

对于文件1,将输入的文件中的单词转换对使用make_pair创建pair对象trans_map。

再用insert函数,如果key不存在,则添加。

while (map_file >>key >>value)
trans_map.insert(make_pair(key, value));

对于文件2,首先使用getline逐行读入,istringstream对象可以绑定一行字符串,然后以空格为分隔符把该行分隔开来。

(例:

stringstream strm(s); //创建存储s的副本的 stringstream 对象,其中 s 是 string 类型的对象

    while ( getline(input, line)) //read a line from the input to line
  {
istringstream stream(line);
string word;
bool firstword = true;
while (stream >>word)
{
/*Use word find the key of trans_map*/
map<string, string>::const_iterator map_it = trans_map.find(word);
if (map_it !=trans_map.end())
/*if there is substitute for word, change the word*/
word = map_it->second;
if (firstword)
firstword = false;
else
cout << " ";
cout << word;
}
cout << endl;
}

从输入文件中一个个读入单词word,如果能在trans_map的key中找到,则将word更改为trans_map的value值,循环录入,使用迭代器:

map<string, string>::const_iterator  map_it = trans_map.find(word);

最后输出word。

答案中还考虑了空格的录入,但是为什么不直接输出cout << word<<" "; ??

if (firstword)
firstword = false;
else
cout << " ";

4.技术小白的一点收获

知道了怎么向main函数传递参数:

通过 项目---属性---配置属性---调试---命令参数惊醒main函数参数的添加,各个参数之间以空格隔开;注意此时添加进去的参数被依次保存为argv[1]、argv[2]……

argc也相应进行的增加,其中第一个参数argv[0]是编译器自动传入的生成的.exe所在的路径。之后在main函数中可以通过printf把已经传入的参数个数和相应的参数内容打印出来,此时的参数类型都是字符串类型的,如果需要要进行相应的类型转化。

当然还有Dos的方法,

“运行”->cmd->d:\e\f.exe g1 g2 g3......

不过为嘛不可以???待解?

对C++ Primer的10.3.9单词转换的思考的更多相关文章

  1. [CareerCup] 18.10 Word Transform 单词转换

    18.10 Given two words of equal length that are in a dictionary, write a method to transform one word ...

  2. C++ Primer : 第十一章 : 关联容器示例: 一个单词转换的map

    单词转换就是:将一些缩写的单词转换为实际的文本.第一个文件保存的是转换的规则,而第二个文件保存的是要转换的文本. 假设单词转换的规则的文件如下: brb be right back k okay? y ...

  3. 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)

    一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...

  4. oracle转Mysql中,varchar2(10)和number应该转换为什么类型?

    一. varchar2(10)和number应该转换为什么类型? oracle转成mysql时:varchar2(10)可以转成varchar(10)number则要看oracle中存储的具体是什么类 ...

  5. [STL]单词转换

    如果单词转换文件的内容是: 'em         themcuz         becausegratz      grateful i             Inah        nopos ...

  6. oracle转Mysql中,varchar2(10)和number应该转换为什么类型? (转)

    一. varchar2(10)和number应该转换为什么类型? oracle转成mysql时:varchar2(10)可以转成varchar(10)number则要看oracle中存储的具体是什么类 ...

  7. 单词转换成向量形式 word2vec

    word2vec(word to vector)是一个将单词转换成向量形式的工具.可以把对文本内容的处理简化为向量空间中的向量运算,计算出向量空间上的相似度,来表示文本语义上的相 似度.word2ve ...

  8. [C++ Primer] : 第10章: 泛型算法

    概述 泛型算法: 称它们为"算法", 是因为它们实现了一些经典算法的公共接口, 如搜索和排序; 称它们是"泛型的", 是因为它们可以用于不同类型的元素和多种容器 ...

  9. C++primer 练习10.16

    // 10.3.2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

随机推荐

  1. URL方式访问Hadoop的内容

    * 1.设置url支持hadoop,FsUrlStreamHandlerFactory      * 2.创建URL对象,指定访问的HDFS路径      * 3.openStream获取输入流对象, ...

  2. HDU-4419 Colourful Rectangle 矩形多面积并

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4419 利用二进制,R为1.G为2.B为4,然后通过异或运算可以得到其它组合颜色.建立7颗线段树,每颗线 ...

  3. IPAddress类

    using System.Net; IPAddress ad1=IPAddress.Parse("192.168.1.1"); //ip为192.168.1.1的地址 IPAddr ...

  4. 教程-(SQL DBE、ADO连接)+(Firebird火鸟+DbExpress)+(VF DBF数据库)+(DB Paradox)

    DBE 连接SQL Server显然用ADO或DBEXPRESS更有优势,起码连接起来比较方便. BDE的话可以用如下方法:(以下以Delphi7为例,其它版本的DELPHI请自己摸索一下,不过基本相 ...

  5. Objective-C-使用NSMutableURLRequest发送POST请求,使用NSJSONSerialization解析JSON字符串

    NSString *reqData = @"Data="; NSData *postDatas = nil; NSString *urlPath = @"url" ...

  6. 在TextView使用部分颜色文字

    /** * change a part of string color. * * @param string * whole string. * @param subString * the sub ...

  7. [Angular 2] Create Angular 2 Porject with Angular CLI

    Install: npm i -g angular-cli Create a project: ng new hello-angular2 Run the project: cd hello-angu ...

  8. TCP/IP 中的二进制反码求和算法

    对于这个算法,很多书上只是说一下思路,没有具体的实现.我在这里举个例子吧 以4bit(计算方便一点,和16bit是一样的)做检验和来验证. 建设原始数据为 1100 , 1010 , 0000(校验位 ...

  9. 局域网动态ip

    1. 局域网IP对网速没有任何影响.点“开始”“设置”进入“网络连接” 右击“本地连接”选择“属性”选中“Internet协议(TCP/IP)” 在下面的一些按钮中点“属性”,之后你可以设置局域网IP ...

  10. Enable SPI 1.0 and 1.1 with device tre overlays on BeagleBone

    For most people the above image means absolutely nothing, but for that one guy that has been searchi ...