【问题标题】:Tokenizing string in c++ using stl [duplicate]使用stl在c ++中标记字符串[重复]
【发布时间】:2012-11-11 12:19:14
【问题描述】:

可能重复:
Splitting a string in C++

我正在尝试从文件中读取数据,其中每行有 15 个字段,由逗号和空格分隔。数据不是单一类型的。目前我正在做的是逐行读取数据,并将每一行传递给 istringstream,并且在每次读取之间我执行以下操作:

ins.ignore(25,','); //ins is the istringstream

但是,我不喜欢我的方法,想要更干净的方法。有什么更好的方法呢?另外我只想使用 stl 而没有外部库。基本上我想要的是使用逗号作为分隔符来标记每一行。

【问题讨论】:

标签: c++ stl inputstream


【解决方案1】:

只需使用自定义操纵器:

std::istream& comma(std::istream& in) {
    if ((in >> std::ws).get() != std::char_traits<char>::to_int_type(',')) {
        in.setstate(std::ios_base::failbit);
    }
    return in;
}
...
in >> v0 >> comma >> v1 >> comma ...

【讨论】:

    【解决方案2】:

    更简洁的方法(如果我理解正确的话)只是将逗号读入虚拟变量

    char comma;
    ins >> comma;
    

    这将跳过任何空格,然后读取逗号,然后您可以忽略它。

    【讨论】:

    • 我想过这样做,但问题是,有些字段可能是空的。例如“12 , , 你好”。我想我可以通过检查读取的值是否为逗号来处理这种情况,然后我将其设置为空。
    • 但是,如果字符不是逗号,您将不得不“未读”该字符。在我看来,您需要忘记流 IO 并在您的线路上进行一些适当的解析。 Zamfir 提供了许多链接来回答这个问题,这个问题被问了很多。
    • 他可以在使用std::ws 跳过空格后的下一个字符处peek()。使用流可以很好地完成像逗号分隔文件这样的微不足道的 patsing 活动。
    猜你喜欢
    • 2012-06-08
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 2010-09-20
    • 2011-05-31
    相关资源
    最近更新 更多