实现功能:给定一个string,将它转换为另一个string。程序输入是两个文件,第一个文件保存转换规则,第二个文件为将要进行转换的文本。

IDE:Windows7+VS2013

  1. #include "stdafx.h"
  2. #include <map>
  3. #include <iostream>
  4. #include <fstream>
  5. #include <string>
  6. #include <stdexcept>
  7. #include <sstream>
  8. using namespace std;
  9. map<string, string> buildMap(ifstream &map_file)     //读入给定rules.text文件,建立转换映射
  10. {
  11. map<string, string> trans_map;   //保存转换规则
  12. string key;                      //要转换的单词
  13. string value;                   //替换后的内容
  14. //读取第一个单词存入key中,行中剩余内容存入value
  15. while (map_file >> key && getline(map_file, value))
  16. if (value.size() > 1)        //检查是否有转换规则
  17. trans_map[key] = value.substr(1);
  18. else
  19. throw runtime_error("no rule for " + key);
  20. return trans_map;
  21. }
  22. const string &transform(const string &s, const map<string, string> &m)
  23. {
  24. auto map_it = m.find(s);
  25. if (map_it != m.cend())        //如果单词在转换规则m中
  26. return map_it->second;     //使用替换短语
  27. else
  28. return s;                  //否则返回原string
  29. }
  30. void word_transform(ifstream &map_file, ifstream &input)
  31. {
  32. auto trans_map = buildMap(map_file);   //保存转换规则
  33. cout << "转换规则为: \n";
  34. for (auto entry : trans_map)
  35. cout << "key: " << entry.first<< "\tvalue: " << entry.second << endl;
  36. cout << "\n\n";
  37. string text;                     //保存输入中的每一行
  38. cout << "转换后为: \n";
  39. while (getline(input, text))
  40. {
  41. istringstream stream(text); //读取每一个单词
  42. string word;
  43. bool firstword = true;     //控制是否打印空格
  44. while (stream >> word)
  45. {
  46. if (firstword)
  47. firstword = false;
  48. else
  49. cout << " ";
  50. cout << transform(word, trans_map);
  51. }
  52. cout << endl;
  53. }
  54. }
  55. int _tmain(int argc, _TCHAR* argv[])
  56. {
  57. if (argc != 3)
  58. throw runtime_error("wrong number of arguments");
  59. ifstream map_file(argv[1]);    //第一个参数为rules.text文件
  60. if (!map_file)
  61. throw runtime_error("no transformation file");
  62. ifstream input(argv[2]);      //第二个参数为text.text文件
  63. if (!input)
  64. throw runtime_error("no input file");
  65. word_transform(map_file, input);
  66. return 0;
  67. }

将rules.text和text.text文件放在E盘根目录下

设置运行时参数,在项目属性里面,配置属性->调试->命令参数里面写上你的参数

调试运行,结果如图示

c++学习笔记——个单词转换的map程序详解的更多相关文章

  1. Ext.Net学习笔记22:Ext.Net Tree 用法详解

    Ext.Net学习笔记22:Ext.Net Tree 用法详解 上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat=&q ...

  2. Ext.Net学习笔记23:Ext.Net TabPanel用法详解

    Ext.Net学习笔记23:Ext.Net TabPanel用法详解 上面的图片中给出了TabPanel的一个效果图,我们来看一下代码: <ext:TabPanel runat="se ...

  3. linux初级学习笔记六:linux用户及权限详解!(视频序号:03_4)

    本节学习的命令:/etc/passwd,/etc/shadow,/etc/group文件详解 本节学习的技能: 安全上下文 文件与目录的权限管理 影子命令 用户,用户组类别详解 /etc/passwd ...

  4. linux初级学习笔记四:Linux文件管理类命令详解!(视频序号:03_1)

    本节学习的命令:cat(tac),more,less,head,tail,cut,sort,uniq,wc,tr 本节学习的技能:目录管理 文件管理 日期时间 查看文本 分屏显示 文本处理 文件管理命 ...

  5. 大前端学习笔记整理【六】this关键字详解

    前言 在上一篇博客里我总结了下辨认this指向的四种方式,但是有师兄抛出一个问题来,我发现那些this的指向并不能说明更复杂的情况,先看下这段代码 var a = { name: 'a', getNa ...

  6. Ext.Net学习笔记07:Ext.Net DirectMethods用法详解

    使用DirectMethods在JS中调用C#方法 我承认,这个标题有点噱头,其实应该是通过DirectMethods,在JS中通过异步调用的方式执行服务器端的方法. 来看一个例子吧: [Direct ...

  7. 学习笔记--Git安装 创建版本库 图文详解

    一.Git下载 在Windows上安装git,一般为msysgit,官网地址:http://git-scm.com/ 我下载的是Git-1.9.2-preview20140411.exe 二.Git安 ...

  8. Ext.Net学习笔记05:Ext.Net DirectEvents用法详解

    Ext.Net通过DirectEvents进行服务器端异步的事件处理.我们在 Ext.Net用法概览 这篇中已经简单的介绍了DirectEvents,今天我们将详细的介绍一下DirectEvents. ...

  9. Android学习笔记(二)Manifest文件节点详解

    在上一篇博文中简单介绍了Manifest文件及其存放位置,本篇就来详细介绍一下Manifest文件中的节点和一些节点的基本作用,首先看一下Manifest文件最基本的结构: <manifest ...

随机推荐

  1. 计算机网络——网络层

    一.虚拟线路与数据报线路 1. 在网络层提供有连接的计算机网络为虚电路网络: 如因特网:它需要VC(虚拟电路)号,用于建立虚拟电路的报文称为信令报文,相关的协议称为信令协议: 无连接的网络为数据报网络 ...

  2. Java如何暂停线程一段时间?

    在Java编程中,如何暂停线程一段时间? 以下示例显示如何通过创建sleepThread()方法来暂停线程一段时间. package com.yiibai; public class Suspendi ...

  3. Ubuntu 12.04安装Java开发环境(jdk1.7 + Eclipse)

    首先,去官网下载linux版本的jdk和eclipse tar包,并将其解压出来.我将jdk包发在了/usr/java/目录下,eclipse放在了/opt/目录下. 然后,配置java开发环境,即安 ...

  4. Office在线预览及PDF在线预览的实现方式

    原文链接:http://www.officeweb365.com/officetoview.html 一.服务器先转换为PDF,再转换为SWF,最后通过网页加载Flash预览 微软方:利用Office ...

  5. form中的button按钮在IE11中自动提交表单问题导致弹出框关闭之后表单被重置

    最近几天,测试系统,遇到一个兼容性问题,form中有一个button按钮,没有指定type类型,点击按钮弹出框选择值之后回填给form上的一个单行文本框,在IE6.IE7.IE8.IE9.IE10中测 ...

  6. weblogic学习笔记:域创建+应用部署

    参考地址:http://docs.oracle.com/cd/E13222_01/wls/docs92/index.html 文档基于版本:weblogic92 域(domain)是weblogic服 ...

  7. SQL SERVER重置自动编号列(标识列)

    两种方法: 一种是用Truncate TRUNCATE TABLE name 可以删除表内所有值并重置标识值 二是用DBCC CHECKIDENT DBCC CHECKIDENT ('table_na ...

  8. 关于SpringMVC Json使用

    很简单的一个东西,这里就不做过多介绍了,写一个小Demo,随手记录下. 首先,在搭好SpringMVC工程环境之后,如果想用Spring自带的Json,需要额外的添加2个JAR包: 1.jackson ...

  9. JSON.stringify报cyclic object value错误

    这是一个典型的循环引用的错误,一个对象里引用自己就会立刻得到这个错误: obj = { x:555, y: "hi" }; obj.myself = obj; try{ json ...

  10. [转] fitnesse中的Map处理

    http://blog.csdn.net/doubeizhucele/article/details/42263887 fintesse会把!{}标记的变量视为HashTable对象,展现到页面上的将 ...