c++ 文字處理
阿新 • • 發佈:2021-12-04
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; }
輸出: