如何在运算符过载中忽略空格输入流>>

时间:2011-10-31 20:59:53

标签: c++ overloading

目前我的重载operator>>函数接受输入[4: 1 2 3 4 ]并且正常工作。但是如何忽略任意数量的空格以便它可以接受[ 4 : 1 2 3 4 ],即在输入之前任意数量的空格?

istream& operator>>( istream & stream, my_vector & vector_a ) {
    string token2;

    int vec_size;
    vector<double> temp_vec;

    bool push = false;

    while (stream >> token2) {
        if (token2[0] == '[' && token2[2] ==':') {
            push = true;
        }

        if (token2 == "]") {
            break;
        }
        else if(!(token2[0] == '[' && token2[2] ==':')) {
            stream.setstate(ios::badbit);
        }

        if(push) {
            istringstream str(token2);
            double v;
            if (str >> v)
                temp_vec.push_back(v);
            vector_a.set_data(temp_vec);
        }
    }

    return stream;
}

2 个答案:

答案 0 :(得分:3)

stream >> std::ws;

从输入序列中的当前位置提取尽可能多的空白字符。一旦找到非空白字符,提取就会停止。提取的这些空格字符不存储在任何变量中。

请注意,即使源流中的​​skipws标记之前是unsetf,也会跳过空格,所以无论如何都应该这样做。

答案 1 :(得分:0)

我想我会按此顺序做点什么:

stream.setf(std::skipws);

char open_bracket, close_bracket, colon;

unsigned num_items, temp_item;

stream >> open_bracket;
stream >> num_items;
stream >> colon;

for (int i=0; i<num_items; i++) {
    stream >> temp_item;
    temp_vec.push_back(temp_item);
}

stream >> close_bracket;

if (open_bracket != '[' || close_bracket != ']' || colon != ':')
    stream.setstate(ios::failbit); 

请注意,为失败的转换设置的位是failbit,而不是badbit。 badbit适用于尝试从磁盘读取失败的事情。