C++ 編寫的解碼器小程序 map

 c++ prime 5 ex11_4

代碼以下

// ex11_4_word_transform.cpp : 定義控制檯應用程序的入口點。 //  #include "stdafx.h" #include <map> #include <vector> #include <iostream> #include <fstream> #include <string> #include <stdexcept> #include <sstream>

using std::map; using std::string; using std::vector; using std::ifstream; using std::cout; using std::endl; using std::getline; using std::runtime_error; using std::istringstream; map<string, string> buildMap(ifstream &map_file) { map<string, string> trans_map;   // holds the transformations
    string key;    // a word to transform
    string value;  // phrase to use instead // read the first word into key and the rest of the line into value
    while (map_file >> key && getline(map_file, value)) if (value.size() > 1) // check that there is a transformation
            trans_map[key] = value.substr(1); // skip leading space 
        else
            throw runtime_error("no rule for " + key); return trans_map; } const string & transform(const string &s, const map<string, string> &m) { // the actual map work; this part is the heart of the program
    auto map_it = m.find(s); // if this word is in the transformation map
    if (map_it != m.cend()) return map_it->second; // use the replacement word
    else
        return s;              // otherwise return the original unchanged
} // first argument is the transformations file; // second is file to transform
void word_transform(ifstream &map_file, ifstream &input) { auto trans_map = buildMap(map_file); // store the transformations // for debugging purposes print the map after its built
    cout << "Here is our transformation map: \n\n"; for (auto entry : trans_map) cout << "key: " << entry.first << "\tvalue: " << entry.second << endl; cout << "\n\n"; // do the transformation of the given text 
    string text;                    // hold each line from the input
    while (getline(input, text)) {  // read a line of input
        istringstream stream(text); // read each word 
        string word; bool firstword = true;      // controls whether a space is printed 
        while (stream >> word) { if (firstword) firstword = false; else cout << " ";  // print a space between words // transform returns its first argument or its transformation 
            cout << transform(word, trans_map); // print the output 
 } cout << endl;        // done with this line of input
 } } int main(int argc, char **argv) { // open and check both files //if (argc != 3) // throw runtime_error("wrong number of arguments");
 argv[1] = "……"; argv[2] = "……"; ifstream map_file(argv[1]); // open transformation file 
    if (!map_file)              // check that open succeeded
        throw runtime_error("no transformation file"); ifstream input(argv[2]);    // open file of text to transform
    if (!input)                 // check that open succeeded
        throw runtime_error("no input file"); word_transform(map_file, input); system("pause"); return 0;  // exiting main will automatically close the files
}

 

 

1.關於main函數中的三個參數 ,ref: int main(int argc,char* argv[])詳解 

char  *argv[]是一個字符數組,其大小是int  argc,主要用於命令行參數  argv[]  參數,數組裏每一個元素表明一個參數;
好比你輸入   
   test   a.c   b.c   t.c   
   則   
   argc   =   4   
    
   argv[0]   =   "test"   
   argv[1]   =   "a.c"   
   argv[2]   =   "b.c"   
   argv[3]   =   "t.c"
--------------------------------------------------------------------------------------------  
argc記錄了用戶在運行程序的命令行中輸入的參數的個數。   
arg[]指向的數組中至少有一個字符指針,即arg[0].他一般指向程序中的可執行文件的文件名。在有些版本的編譯器中還包括程序文件所在的路徑。
-------------------------------------------------------------------------
在調用一個可執行程序時,某些狀況下須要向程序傳遞參數。如咱們能夠在控制檯中鍵notepad.exe,
回車後將執行記事本程序。若是咱們但願在打開notepad時同時打開一個文本文件,能夠在notepad.exe 後面跟上文件的路徑和名字,如notepad.exe   example.txt(文件在當前路徑)。   
    
   那麼程序中如何能獲得這些輸入參數呢?這個工做是編譯器幫咱們完成的,編譯器將輸入參數的信息
放入main函數的參數列表中。   
    
   main函數的參數列表保存了輸入參數的信息,第一個參數argc記錄了輸入參數的個數,第二個參數是字符串數組的,字符串數組的每一個單元是char*類型的,指向一個c風格字符串。   
   以notepad.exe   example.txt爲例   
   argc是2,就是說argv數組中有兩個有效單元   
   第一單元指向的字符串是"notepad.exe"   
   第二單元指向的字符串是"example.txt"   
    
   argv數組中的第一個單元指向的字符串老是可執行程序的名字,之後的單元指向的字符串依次是程序調用時的參數。   
    
   這個賦值過程是編譯器完成的,咱們只須要讀出數據就能夠了。
html

 

2.讀寫文件,ref:C++文件讀寫詳解(ofstream,ifstream,fstream)

 

 

 3. getline

ref:cin 輸入空格符和 getline() 忽略開頭換行符ios

C++中cin、cin.get()、cin.getline()、getline()、gets()等函數的用法c++

 


用cmd執行

argv[1]是exe的轉義字符路徑,argv[2]是 rules文件的轉義字符路徑,argv[3]是待轉換文件的轉義字符路徑。

 

 

相關文章
相關標籤/搜索