C++ 尝试标记字符串
可能重复:C++ 尝试标记字符串,c++,tokenize,end-of-line,C++,Tokenize,End Of Line,可能重复: 我有这个文本文件 q1 t q2 q2 e q3 q3 x q4 q4 t q5 q6 q11 q5 | q6 q11 我想提取每个被空格分隔的元素。例如,在第一行中,我希望能够提取“q1”“t”和“q2”作为单独的标记 我想这有两种方法 使用ifstream>>逐个令牌读取文件。这种方法的问题是,我不知道如何判断何时到达了一行的末尾,以便我可以移动到下一行 另一种方法是使用getline()一次获取整个行;这种方法的问题是我必须自己标记字符串,而且每一行都不同,所以我
我有这个文本文件
q1 t q2
q2 e q3
q3 x q4
q4 t q5 q6 q11
q5 | q6 q11
我想提取每个被空格分隔的元素。例如,在第一行中,我希望能够提取“q1”“t”和“q2”作为单独的标记
我想这有两种方法
使用
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
}
}
使用
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
}
}
如果您只想使用标准库,则可以使用
getline
,然后使用stringstream
逐字执行ifstream>
it
另外,C++在文本处理方面确实非常有限,您可以更容易地使用QT和流,或者从Boost(包括S拆股)来做,这与STL字符串很好地结合。您可以使用
getline
,然后使用stringstream
逐字执行ifstream>
it
另外,C++在文本处理方面确实非常有限,您可以更容易地使用QT和流,或者从Boost(包括S拆股)来做,这与STL字符串很好地结合。如果是这样的话,第一个可以很好地工作,并且可以通过使用两个迭代器的
std::vector
构造函数进行扩展。如果您的令牌像这样被空格(包括换行符)很好地分隔开,while(fs>>str)
将完全适合您。要么您的换行符有意义。然后转到getline()
,并通过stringstream将该行输入以获取令牌。或者您的换行没有意义,那么从ifstream
读取将像任何其他空白一样忽略它们。那么您希望一个包含文件中每个标记的巨大线性数组吗?如果是这样的话,第一个可以很好地工作,并且可以通过使用两个迭代器的std::vector
构造函数进行扩展。如果您的令牌像这样被空格(包括换行符)很好地分隔开,while(fs>>str)
将完全适合您。要么您的换行符有意义。然后转到getline()
,并通过stringstream将该行输入以获取令牌。或者你的换行没有意义,那么从ifstream
中读取会像其他空白一样忽略它们。这也是我会做的。。。这是一个很好的方法,当你很匆忙的时候,把一个简单的配置文件放在一起=)太棒了,现在尝试一下,看起来很容易!我也会这么做。。。这是一个很好的方法,当你很匆忙的时候,把一个简单的配置文件放在一起=)太棒了,现在尝试一下,看起来很容易!