2013-09-20 3 views
2

Я пытаюсь перегрузить оператора >>, чтобы принять различные разделители. Я пытался, но не мог.Переопределить istream operator >> и изменить разделитель

Кто-то должен знать решение?

Мой подход не работает.

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

E.g. вход:

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

Или

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

...

Примечание: я нашел ответы на форуме, но не помогло мне.

ответ

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"; 
    } 
} 

ПРИМЕЧАНИЕ: Я пытался скомпилировать этот код с GCC на Mac, и это не удается! Причина на самом деле не в программе, но проблема в том, что std::ctype<char>::classic() возвращает нулевой указатель. Я понятия не имею, что это такое. Однако компиляция с помощью clang и libC++.

+0

спасибо. Ваш ответ помог мне. Мне понравилось объяснение. –

Смежные вопросы