我们可以更改“>>”的默认行为吗? stringstream对象的重载运算符?

时间:2015-06-03 10:12:49

标签: c++ c++11

我的要求如下所述。 我正在读取包含

的stringstream对象中的文件
"NECK_AP \
UL, 217.061, -40.782\n\
UR, 295.625, -40.782\n\
LL, 217.061, 39.194\n\
LR, 295.625, 39.194".

当我试图填充变量中的值时,我也会得到“,”以及它。可以任何人建议,以便我可以将所有这些值存储在相应的变量中,而不是“,”

只是一个帮助这种情况的示例代码:

int _tmain(int argc, _TCHAR* argv[])
{
    char pause;
    stringstream stream;
    stream.str("NECK_AP \
UL, 217.061, -40.782\n\
UR, 295.625, -40.782\n\
LL, 217.061, 39.194\n\
LR, 295.625, 39.194");

    string value1,value2,value3,value4;

    stream >> value1>>value2>>value3>>value4;
    cout << value1<<value2<<value3<<value4<<endl;           

    cin >> pause;
    return 0;
}

输出

NECT_AP UL,217.061,-40.782

必需输出

NECT_AP UL 217.061 -40.782

2 个答案:

答案 0 :(得分:0)

您需要了解函数(或运算符等)(大多数时候)是为了完成某项工作而编写的。运营商&gt;&gt;有从数据流到某个地方获取数据的工作。这是它的工作,它应该是这个。您想要做的是编写新功能(或使用现有功能),稍后将根据您的需要更改值。

借助标准库可以轻松实现您想要做的事情:

#include <algorithm>
//some code...
std::replace_if(value1.begin(), value1.end(), [](char x){return x == ',';}, ' ');

为每个值做这件事。或者,将所有内容加载到一个字符串中,对此字符串使用此函数,然后打印其内容。 它有什么作用? replace_if有四个参数:容器的开始和结束迭代器(前两个参数),一些谓词函数(我使用所谓的lambda表达式,或匿名函数;但你可以编写单独的函数并提供它的名字,没问题!),以及新的价值。基本上它可以被翻译为“用''替换字符串中的每个字符,如果它符合谓词(换句话说,是冒号)。

答案 1 :(得分:0)

你可以这样做。 operator>> std::string跳过空白字符,然后将字符读入提供的变量,直到它到达另一个空白字符。

该流具有关联的区域设置,用于确定哪些字符被视为“白色空间”或不被视为“空白区域”。我们可以编写自己的语言环境,将,分类为'white-space`,告诉流使用该语言环境,并根据需要读取我们的数据。

为了简单起见,我编写了一些代码,只是将所有字符串读入一个向量,然后显示它在自己的行上读取的每个字符串,这样就可以很容易地看到它读入每个字符串的内容。 / p>

#include <locale>
#include <string>
#include <vector>
#include <sstream>
#include <iterator>
#include <algorithm>
#include <iostream>

struct reader: std::ctype<char> {
    reader(): std::ctype<char>(get_table()) {}

    static std::ctype_base::mask const* get_table() {
        static std::vector<std::ctype_base::mask> 
            rc(std::ctype<char>::table_size,std::ctype_base::mask());

        rc[','] = std::ctype_base::space;
        rc['\n'] = std::ctype_base::space;
        rc[' '] = std::ctype_base::space;
        return &rc[0];
    }
};

int main() {
    std::istringstream infile("NECK_AP \
                              UL, 217.061, -40.782\n\
                              UR, 295.625, -40.782\n\
                              LL, 217.061, 39.194\n\
                              LR, 295.625, 39.194");

    infile.imbue(std::locale(std::locale(), new reader));

    std::vector<std::string> d { std::istream_iterator<std::string>(infile),
        std::istream_iterator<std::string>() };

    std::copy(d.begin(), d.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    return 0;
}