1. 程式人生 > 其它 >c++ 文字處理

c++ 文字處理

c++ 文字處理

1、使用sstream版本

(1)功能:擷取第一列為1以後的資料,如下圖,擷取第5行(包括第5行)以後的資料,前面4行資料丟棄。

(2)程式碼:textProc.cc

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>

using namespace std;

int main(int argc, char *argv[]) {// *argv[] 是一個指標陣列,也就是一個字串陣列。
    string dir = "/data/";

    string old_file = dir + argv[1] + "/input/txdsp_input_old.dat";
    string gen_file = dir + argv[1] + "/input/txdsp_input.dat";
    string cmd      = "mv ";
    cmd             = cmd + gen_file + " " + old_file;

    if(system(cmd.c_str()) == 0) {
        cout<<"file move ok !"<<endl;
    } else {
        cout<<"file move failed !"<<endl;
    }

    ifstream is(old_file);
    ofstream os(gen_file);
    istringstream iss;
    string line, word;

    while(getline(is, line)) {
        iss.str(line);          // 重新整理string流中的字串
        iss.clear();            // 清除string流中的狀態,如果string流讀完了failbit會拉起,導致重新整理了新資料也不能讀取。
        iss>>word;              // 利用string流一個一個單詞的讀取, 這裡只讀一個幀頭標識。

        if(word == "1") {       // 將找到幀頭後的所以資料都輸出。
            os<<line<<endl;
            break;
        }
    }

    while(getline(is, line)) {
        os<<line<<endl;
    }

    os.close();
    is.close();
    return 0;
}

2、regex版本

#include <iostream>
#include <fstream>
#include <regex>
#include <string>

using namespace std;

int main(int argc, char *argv[]) {// *argv[] 是一個指標陣列,也就是一個字串陣列。
    string dir = "/data/";

    string old_file = dir + argv[1] + "/input/txdsp_input_old.dat";
    string gen_file = dir + argv[1] + "/input/txdsp_input.dat";
    string cmd      = "mv ";
    cmd             = cmd + gen_file + " " + old_file;

    if(system(cmd.c_str()) == 0) {
        cout<<"file move ok !"<<endl;
    } else {
        cout<<"file move failed !"<<endl;
    }

    ifstream is(old_file);
    ofstream os(gen_file);
    string line;
    smatch results;

    regex re("^1.*");
    while(getline(is, line)) {
        if(regex_search(line, results, re)) {       // 將找到幀頭後的所以資料都輸出。
            os<<line<<endl;
            break;
        }
    }

    while(getline(is, line)) {
        os<<line<<endl;
    }


    regex re2("^tel:(\\d{11}),addr:(\\w+)");        // 正則表示式相對於python的要多加一個反斜槓“\”,應該\在C是特殊字元
    string str = "tel:15688886666,addr:sichuan";
    regex_search(str, results, re2);                //傳給regex_search的字串可以是string,char,wchar等4種類型,對應的使用smatch,cmatch、wcmatch等4中型別。為了簡單,一般只使用string+smatch。
    cout<<results.str()<<endl;               //列印整個str
    cout<<results.str(1)<<endl;                 //列印第一個匹配的括號(\\d{11})
    cout<<results.str(2)<<endl;                  //列印第二個匹配的括號(\\w+)

    os.close();
    is.close();
    return 0;
}

輸出: