Вы не можете перегрузить оператор ввода для работы, например, с 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";
}
}
ПРИМЕЧАНИЕ: Я пытался скомпилировать этот код с GCC на Mac, и это не удается! Причина на самом деле не в программе, но проблема в том, что std::ctype<char>::classic()
возвращает нулевой указатель. Я понятия не имею, что это такое. Однако компиляция с помощью clang и libC++.
спасибо. Ваш ответ помог мне. Мне понравилось объяснение. –