2012-10-15 56 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字符串很好的整合更容易做的事情。