2012-10-15 101 views
0

可能重複:
How do I tokenize a string in C++?嘗試來標記一個字符串

我有這個文本文件

q1 t q2 

q2 e q3 

q3 x q4 

q4 t q5 q6 q11 

q5 | q6 q11 

我想提取由空格分隔每個元素。例如,在第一行中,我希望能夠將「q1」「t」和「q2」作爲單獨的標記提取出來。

我想有兩種方式去了解這個

  1. 從文件,通過令牌令牌讀取,使用ifstream的>>。我用這種方法遇到的問題是,我不知道如何知道何時到達行的末尾,以便我可以移動到下一行。

  2. 另一種方法是使用getline()一次獲得整行。這種方法的問題是我必須自己標記字符串,每一行都不一樣,所以我不確定這是最好的想法。我非常喜歡,除了strtok(),這看起來並不是我想要的。感謝球員任何幫助表示讚賞。

+0

那麼你想要一個巨大的線性數組包含文件中的每個標記?如果是這樣,第一個工作正常,可以用'std :: vector'的構造函數增加兩個迭代器。 – chris

+0

如果你的令牌被空白(包括換行符)很好地隔開,那麼'while(fs >> str)'完全適合你。 – WhozCraig

+0

你的換行符有意義。然後去'getline()'並通過stringstream提供行來獲取標記。或者你的換行符*不具有意義,那麼從'ifstream'中讀取將會像其他任何空白字符一樣忽略它們。 – DevSolar

回答

3

使用getline,和來標記生成的字符串,把它變成一個std::stringstream和提取的令牌。

std::string line_string; 
while (getline(file, line_string)) { 
    std::istringstream line(line_string); 
    std::string token; 
    while (line >> token) { 
     do something with token 
    } 
} 
+0

這就是我也會做的......這是一個很好的方式,當你匆忙地把一個簡單的配置文件夾在一起=) – paddy

+0

真棒,現在嘗試,看起來很容易! –

0

如果你只想使用標準庫,你可以去用getline,然後通過文字使用stringstreamifstream>>其詞。

否則C++的確是相當的文字處理方面的限制,你可以用Qt的strings和溪流,或string algorithms從boost(包括分割),這與STL字符串很好的整合更容易做的事情。