如何使用带有多个分隔符的istringstream

时间:2012-09-19 18:43:48

标签: c++ parsing

您好我想问一下如何用字符串解析多个浮点数,用“/”和空格分隔。

该文件的文字格式为“f 1/1/1 2/2/2 3/3/3 4/4/4” 我需要将这行文本中的每个整数解析成几个int变量,然后用它们来构造一个“face”对象(见下文)。

int a(0),b(0),c(0),d(0),e(0);
int t[4]={0,0,0,0};
//parsing code goes here
faces.push_back(new face(b,a,c,d,e,t[0],t[1],t[2],t[3],currentMaterial));

我可以用sscanf()做到这一点,但是我已经被我的uni讲师警告过了,所以我正在寻找另一种选择。我也不允许其他第三方库,包括boost。

已经提到了正则表达式和使用stringstream()进行解析,但我对这两者都不太了解,并且非常感谢一些建议。

4 个答案:

答案 0 :(得分:1)

如果您正在使用std :: ifstream读取文件,则首先不需要std :: istringstream(尽管使用这两者非常相似,因为它们从相同的基类继承)。以下是使用std :: ifstream:

的方法
ifstream ifs("Your file.txt");
vector<int> numbers;

while (ifs)
{
    while (ifs.peek() == ' ' || ifs.peek() == '/')
        ifs.get();

    int number;
    if (ifs >> number)
        numbers.push_back(number);
}

答案 1 :(得分:1)

考虑到您的示例f 1/1/1 2/2/2 3/3/3 4/4/4您需要阅读的内容是:char int char int char int int char int char int int char int char int

要做到这一点:

istringstream是(str);

char f, c;
int d[12];

bool success = (is >> f) && (f == 'f') 
            && (is >> d[0])  && (is >> c) && (c == '/') 
            && (is >> d[1])  && (is >> c) && (c == '/') && 
            .....  && (is >> d[11]);

答案 2 :(得分:1)

我这样做的方法是change the interpretation of space包括其他分隔符。如果我想要使用,我会使用不同的std::ostream个对象,每个对象设置一个std::ctype<char>构面来处理一个分隔符,并使用共享的std::streambuf

如果你想明确使用分隔符,你可以使用合适的操纵器来跳过分隔符,如果不存在则表示失败:

template <char Sep>
std::istream& sep(std::istream& in) {
    if ((in >> std::ws).peek() != std::to_int_type(Sep)) {
        in.setstate(std::ios_base::failbit);
    }
    else {
        in.ignore();
    }
    return in;
}

std::istream& (* const slash)(std::istream&) = Sep<'/'>;

代码未经过测试并在移动设备上输入,即可能包含小错误。你会读到这样的数据:

if (in >> v1 >> v2 >> slash >> v3 /*...*/) {
  deal_with_input(v1, v2, v3);
}

注意:上述用法假定输入为

1.0 2.0/3.0

即。第一个值后面的空格和第二个值后面的斜杠。

答案 3 :(得分:0)

您可以使用boost :: split。

示例示例是:

string line("test\ttest2\ttest3");
vector<string> strs;
boost::split(strs,line,boost::is_any_of("\t"));

cout << "* size of the vector: " << strs.size() << endl;    
for (size_t i = 0; i < strs.size(); i++)
    cout << strs[i] << endl;

此处提供更多信息:

http://www.boost.org/doc/libs/1_51_0/doc/html/string_algo.html

并且还相关:

Splitting the string using boost::algorithm::split