覆盖istream运算符>>并修改分隔符

时间:2013-09-20 00:16:07

标签: c++ istream

我正在尝试重载运算符>>接受各种分隔符。我试过但不能。

有人必须知道解决方案吗?

我的做法不起作用。

template<typename A>
istream& operator >> (istream& is, const A& record) {
        is >> record;
        is.ignore(1, ',');
        return is;
}  

E.g。输入:

1;2
3;4
5;6
7;8

或者

1,2
3,4
5,6
7,8

...

注意:我在论坛中找到了一些答案,但没有帮助我。

2 个答案:

答案 0 :(得分:3)

您无法使输入运算符超载(例如,使用int)。我不完全确定你想要达到的目标,但是你可以处理不需要的分隔符的一种方法就是将它们变成神奇的空间!假设您尝试使用类似

的循环读取数据
for (int a, b; std::cin >> a >> b; ) {
    std::cout << "a=" << a << " b=" << b << "\n";
}

所有真正需要的是将单独处理为空格并跳过。为此,您可以使用自定义std::ctype<char>构面:

#include <algorithm>
#include <iostream>
#include <locale>

struct ctype
    : std::ctype<char>
{
    typedef std::ctype<char> base;
    static base::mask const* make_table(unsigned char space,
                                        base::mask* table)
    {
        base::mask const* classic(base::classic_table());
        std::copy(classic, classic + base::table_size, table);
        table[space] |= base::space;
        return table;
    }
    ctype(unsigned char space)
    : base(make_table(space, table))
    {
    }
    base::mask table[base::table_size];
};

int main()
{
    std::locale global;
    std::locale loc(global, new ctype(';'));
    std::cin.imbue(loc);
    for (int a, b; std::cin >> a >> b; ) {
        std::cout << "a=" << a << " b=" << b << "\n";
    }
}

注意:我试图在Mac上使用gcc编译此代码,但它失败了!原因实际上不在程序中,但问题是std::ctype<char>::classic()返回空指针。我不知道那是什么。但是,使用clang和libc ++进行编译可以正常工作。

答案 1 :(得分:0)