我正在尝试重载运算符>>以接受各种分隔符。我尝试过但不行。
一定有人知道解决方案吗?
我的方法不起作用。
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/