c++ 一次完整讀檔案 及 實現string 的split方法
阿新 • • 發佈:2019-01-30
要把檔案的字串讀出,並將它分塊(split)。
首先檔案一行一行讀臺麻煩,網上搜了下,發現寶貝,一次讀取整個檔案到記憶體中, http://www.360doc.com/content/13/1101/01/14458144_325725835.shtml
std::ifstream inf("hlh_lc_cluster.def",std::ios::in); if(!inf) { std::cout<<"cannot open file"<<std::endl; return -1; } std::string str_file=""; std::stringstream tmp; tmp<<inf.rdbuf(); str_file=tmp.str();
很多其他語言的libary都會有去除string類的首尾空格的庫函式,但是標準C++的庫卻不提供這個功能。
同樣,網上搜了一個程式碼,除錯的時候發現分出來的結果一個想要的結果,接著一個空元素,…… 仔細查看了下程式碼,原來他將delim長度預設成了1,沒考慮到分詞符可能是多個字元。
//注意:當字串為空時,也會返回一個空字串 void split(std::string& s, std::string& delim,std::vector< std::string >* ret) { size_t last = 0; size_t index=s.find_first_of(delim,last); while (index!=std::string::npos) { ret->push_back(s.substr(last,index-last)); last=index+1; index=s.find_first_of(delim,last); } if (index-last>0) { ret->push_back(s.substr(last,index-last)); } }
修改程式碼:將last=index+1; 改成last=index+delim.length();
OK!
ps:之前誤以為find_first_of是找第一個匹配的位置,今天做另一個東西的時候突然發現程式有問題,追查之下才發現find_first_of不是之前理解的意思。
首先,STL string 中有find函式和find_first_of函式,find函式(str1.find(str2))才是找str1中有str2子串,如果有則返回第一個匹配子串的首字元的index,如果沒有則返回string::npos; 而find_first_of 函式(str1.find_first_of(str2))是找str1中出現str2字元 ,如果有……
修改程式碼: 將find_first_of 換成find
參見 另一篇博文http://blog.csdn.net/jinjiaoooo/article/details/26626117