C++自学笔记_单词转换map对象_《C++ Primer》

今天在干《C++ Primer》第10章的时候似乎遇到了一点小瓶颈,翻回第8章吃了顿回头草。所以,老话说得好:欠下的总是要还滴 :)

一个小程序,很简单:单词转换程序:程序输入两个文件,第一个文件包括了若干单词对,没对的第一个单词将出现在输入的字符串中,而第二个单词

则是用于输出。本质上,这个文件提供的是单词转化的集合——在遇到第一个单词时,应该将之替换为第二个单词。第二个文件则提供了与要转换的文本。

打个比方:如果单词转换文件的内容为:

而要转换的文本是:

Code:

#include <iostream>
#include <map>
#include <fstream>

using namespace std;

int main()
{
    string fileName1("F:\\file1.txt");       //file1
    string fileName2("F:\\file2.txt");       //file2
    string fileName3("F:\\file3.txt");       //file3
    map<string,string> trans_map;            //定义map对象,存储file1的内容
    string key,value;                        //键值对
    ifstream infile;                         //infile提供读文件操作,读file1.txt
    infile.open(fileName1.c_str());          //别忘了要把文件名转化为C风格字符串!
    if(!infile){
        cerr<<"error:enable open file:"<<fileName1<<endl;
        return 0;
    }else{
        cout<<"open file:"<<fileName1<<" success"<<endl;
    }
    while(infile>>key>>value){                //将file1中的键值对读出来存放在trans_map内
        trans_map.insert(make_pair(key,value));
    }
    infile.close();
    ifstream input;                           //input提供读文件操作,读file2.txt
    ofstream outfile;                         //outfile提供写文件操作,写入file3.txt
    input.open(fileName2.c_str());
    if(!input){
        cerr<<"error:enable open file:"<<fileName2<<endl;
        return 0;
    }else{
        cout<<"open file:"<<fileName2<<" success"<<endl;
    }
    outfile.open(fileName3.c_str());
    if(!outfile){
        cerr<<"error:enable open file:"<<fileName3<<endl;
        return 0;
    }else{
        cout<<"open file:"<<fileName3<<" success"<<endl;
    }
    string word;
    bool firstWord=true;                     //用来判断是否是第一个单词,用来处理空格的输出
    while(input>>word){                      //读单词(string)
        map<string,string>::const_iterator iter=trans_map.find(word);   //如果word存在,返回指向word的迭代器
        if(iter!=trans_map.end()){
            word=iter->second;               //迭代器是指向一个存在的元素,把word修改为file1.txt规定的对应的单词
            cout<<word<<endl;                //这个是输出在Console上看了玩的
        }
        if(firstWord){                       //第1个单词的情况
            firstWord=false;
            outfile<<word;
        }
        else{
            outfile<<" "<<word;              //从第2个开始就要在每个单词前面输出一个空格了
        }
        input.clear();
        outfile.clear();
    }
    outfile<<endl;
    return 0;
}

鲁棒性有待商榷,还需要多次优化。

程序将在一个文本文件写入结果:

睡一觉再动手 :)

时间: 2024-12-28 09:00:46

C++自学笔记_单词转换map对象_《C++ Primer》的相关文章

c++ 单词转换 map对象

#include <map> #include <sstream> #include <fstream> #include <iostream> #include <string> #include <exception> using namespace std; ifstream& openfile(ifstream &in,const string &filename){ in.close();//clos

记一次踩坑 Gson转换map对象时 Integer类型自动转换成Double类型

之前一直使用json转换map对象,因为公司统一使用gson,我按照网上转换map对象的方式转换: Map<String, Object> params = gson.fromJson(gson.toJson(payMentResultDto), Map.class); 结果对象里Integer类型自动变成double类型... 解决办法: 网上大致有俩种,1.修改源码(能力达不到)2.增加适配器 我找了一下,解决办法有俩种(比较实用) 1.网上看到的(自定义类型适配器),亲测可用 //这俩段

c++学习笔记——个单词转换的map程序详解

实现功能:给定一个string,将它转换为另一个string.程序输入是两个文件,第一个文件保存转换规则,第二个文件为将要进行转换的文本. IDE:Windows7+VS2013 [cpp] view plaincopy #include "stdafx.h" #include <map> #include <iostream> #include <fstream> #include <string> #include <stdex

面向对象程序设计-C++_课时28静态对象_课时29静态成员

Static in C++ Two basic meanings Static Storage --allocated once at a fixed address Visibility of a name --internal linkage Don't use static except inside functions and classes. Uses of "static" in C++ Static free functions----deprecated弃用 Stati

『PyTorch』第五弹_深入理解Tensor对象_中上:索引

一.普通索引 示例 a = t.Tensor(4,5) print(a) print(a[0:1,:2]) print(a[0,:2]) # 注意和前一种索引出来的值相同,shape不同 print(a[[1,2]]) # 容器索引 3.3845e+15 0.0000e+00 3.3846e+15 0.0000e+00 3.3845e+15 0.0000e+00 3.3845e+15 0.0000e+00 3.3418e+15 0.0000e+00 3.3845e+15 0.0000e+00 3

『PyTorch』第五弹_深入理解Tensor对象_中下:数学计算以及numpy比较

一.简单数学操作 1.逐元素操作 t.clamp(a,min=2,max=4)近似于tf.clip_by_value(A, min, max),修剪值域. a = t.arange(0,6).view(2,3) print("a:",a) print("t.cos(a):",t.cos(a)) print("a % 3:",a % 3) # t.fmod(a, 3) print("a ** 2:",a ** 2) # t.po

『PyTorch』第五弹_深入理解Tensor对象_下:从内存看Tensor

Tensor存储结构如下, 如图所示,实际上很可能多个信息区对应于同一个存储区,也就是上一节我们说到的,初始化或者普通索引时经常会有这种情况. 一.几种共享内存的情况 view a = t.arange(0,6) print(a.storage()) b = a.view(2,3) print(b.storage()) print(id(a.storage())==id(b.storage())) a[1] = 10 print(b) 上面代码,我们通过.storage()可以查询到Tensor

Effective C++_笔记_条款12_复制对象时勿忘其每一个成分

(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 编译器会在必要时候为我们的classes创建copying函数,这些“编译器生成版”的行为:将被烤对象的所有成员变量都做一份拷贝. 如果你声明自己的copying函数,意思就是告诉编译器你并不喜欢缺省实现中的某些行为.编译器仿佛被冒犯似的,会以一种奇怪的方式回敬:当你的实现代码几乎必然出错时却不告诉你.所以自己实现copying函数时,请遵循一条规则:如果你为c

Map对象转换成Json格式的String字符串

1 //action处理页面发来的String,put到map转换成Json格式的String字符串 2 @RequestMapping("/seleteOaOrder") 3 @ResponseBody 4 public Object seleteOaOrder(String param){//param = "小明"; 5 System.out.println("+++++++++++++++++param:"+param); 6 if(pa