2

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

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

我的方法不起作用。

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

例如输入:

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

或者

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

...

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

4

2 回答 2

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++ 进行编译是可行的。

于 2013-09-20T01:46:26.727 回答
0

请参阅此处接受的解决方案的第一个变体以获取可能的实现:c++ program for read an unknown size csv file (fill only with floats) with constant (but unknown) number of columns into an array

于 2013-09-20T00:59:42.787 回答