gpt4 book ai didi

c++ - 覆盖 istream 运算符 >> 并修改定界符

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:40 25 4
gpt4 key购买 nike

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

一定有人知道解决办法?

我的方法行不通。

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com