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”作为单独的标记

我想这有两种方法

  • 使用ifstream>>逐个令牌读取文件。这种方法的问题是,我不知道如何判断何时到达了一行的末尾,以便我可以移动到下一行

  • 另一种方法是使用getline()一次获取整个行;这种方法的问题是我必须自己标记字符串,而且每一行都不同,所以我不确定这是最好的主意。我非常震惊,除了strtok()之外,没有任何内在的方法可以做到这一点,而strtok()看起来根本不是我想要的。谢谢各位,谢谢你们的帮助


  • 使用
    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
    中读取会像其他空白一样忽略它们。这也是我会做的。。。这是一个很好的方法,当你很匆忙的时候,把一个简单的配置文件放在一起=)太棒了,现在尝试一下,看起来很容易!我也会这么做。。。这是一个很好的方法,当你很匆忙的时候,把一个简单的配置文件放在一起=)太棒了,现在尝试一下,看起来很容易!