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

标签 c++ istream

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

一定有人知道解决方案吗?

我的方法不起作用。

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

...

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

最佳答案

您不能重载输入运算符来工作,例如使用 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++ 进行编译是可行的。

关于c++ - 覆盖 istream 运算符 >> 并修改分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18907007/

相关文章:

c++ - 将 PicklingTools 与 QT Creator 一起使用

c++ - 重载有理数类的 istream >> 运算符。不知道如何处理整数

没有输入时C++ getline不为空

c++ - istream 提取运算符 : how to detect parse failure?

c++ - 比较字符串 (C++)

c++ - 在 notepad.exe 中 Hook CreateFile 不会捕获 API 调用

c++ - 仅当语句匹配时如何将参数发送给函数?

C++ istream 提取器精度?

c++ - 异常处理。如何抛出一个迭代器?

c++ - C++ 中的多线程池