1. 程式人生 > >c++ 一次完整讀檔案 及 實現string 的split方法

c++ 一次完整讀檔案 及 實現string 的split方法

要把檔案的字串讀出,並將它分塊(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