Форум программистов, компьютерный форум CyberForum.ru

Перегрузка оператора ввода - C++

Восстановить пароль Регистрация
 
FreeMan108
 Аватар для FreeMan108
120 / 120 / 6
Регистрация: 04.03.2013
Сообщений: 368
27.11.2013, 21:30     Перегрузка оператора ввода #1
Добрый вечер, уважаемые форумчане. Возник вопрос о перегрузке оператора ввода.

Имеется класс string

C++
1
2
3
4
class String{
       friend std::istream& operator >> (std::istream&, String &);
       // ...
};
Ну и собственно вопрос - как его правильно реализовать.

Видел такой вариант у Дейтела

C++
1
2
3
4
5
6
7
8
9
istream& operator >> (std::istream& input, String &s)
{
char buf [100];
cin >> buf;
delete [] s.Str;
s.Str = new char [101];
strcpy (s.Str, buf);
return input;
}
Ну а что если длина строки больше 100? Полагаю, что есть способ более эффективный.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.11.2013, 22:04     Перегрузка оператора ввода #2
Цитата Сообщение от FreeMan108 Посмотреть сообщение
Ну а что если длина строки больше 100? Полагаю, что есть способ более эффективный.
Читать посимвольно. Посмотрите на реализацию operator>> для std::string в Вашем компиляторе.
FreeMan108
 Аватар для FreeMan108
120 / 120 / 6
Регистрация: 04.03.2013
Сообщений: 368
27.11.2013, 22:26  [ТС]     Перегрузка оператора ввода #3
Цитата Сообщение от Tulosba Посмотреть сообщение
Читать посимвольно.
Читать посимвольно это да, но как это дело занести в динамический массив непонятно. Его же размер нужно менять (увеличивать на 1) после каждого символа, а как это сделать.

Цитата Сообщение от Tulosba Посмотреть сообщение
Посмотрите на реализацию operator>> для std::string в Вашем компиляторе.
Где ее смотреть? Есть же только интерфейс класса.
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
28.11.2013, 02:57     Перегрузка оператора ввода #4
Цитата Сообщение от FreeMan108 Посмотреть сообщение
Где ее смотреть? Есть же только интерфейс класса.
Не правда. Можно абсолютно свободно скачать исходные коды libstdc++ с ФТП gnu. (В составе GCC) и там порыться.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
28.11.2013, 07:54     Перегрузка оператора ввода #5
Цитата Сообщение от FreeMan108 Посмотреть сообщение
Читать посимвольно это да, но как это дело занести в динамический массив непонятно. Его же размер нужно менять (увеличивать на 1) после каждого символа, а как это сделать.
Про то, как работает std::vector не слышали?

Цитата Сообщение от FreeMan108 Посмотреть сообщение
Где ее смотреть? Есть же только интерфейс класса.
std::string шаблонный класс, а значит доступен в виде исходников. Пройдитесь отладчиком и всё увидите.
FreeMan108
 Аватар для FreeMan108
120 / 120 / 6
Регистрация: 04.03.2013
Сообщений: 368
28.11.2013, 22:13  [ТС]     Перегрузка оператора ввода #6
Что-то ничего не нашел. Можно ссылку на ресурс или исходный код.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
28.11.2013, 22:30     Перегрузка оператора ввода #7
Цитата Сообщение от FreeMan108 Посмотреть сообщение
Что-то ничего не нашел. Можно ссылку на ресурс или исходный код.
Вот из студии например код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
        // basic_string INSERTERS AND EXTRACTORS
template<class _Elem,
    class _Traits,
    class _Alloc> inline
    basic_istream<_Elem, _Traits>& operator>>(
        basic_istream<_Elem, _Traits>&& _Istr,
        basic_string<_Elem, _Traits, _Alloc>& _Str)
    {   // extract a string
    typedef ctype<_Elem> _Ctype;
    typedef basic_istream<_Elem, _Traits> _Myis;
    typedef basic_string<_Elem, _Traits, _Alloc> _Mystr;
    typedef typename _Mystr::size_type _Mysizt;
 
    ios_base::iostate _State = ios_base::goodbit;
    bool _Changed = false;
    const typename _Myis::sentry _Ok(_Istr);
 
    if (_Ok)
        {   // state okay, extract characters
        const _Ctype& _Ctype_fac = _USE(_Istr.getloc(), _Ctype);
        _Str.erase();
 
        _TRY_IO_BEGIN
        _Mysizt _Size = 0 < _Istr.width()
            && (_Mysizt)_Istr.width() < _Str.max_size()
                ? (_Mysizt)_Istr.width() : _Str.max_size();
        typename _Traits::int_type _Meta = _Istr.rdbuf()->sgetc();
 
        for (; 0 < _Size; --_Size, _Meta = _Istr.rdbuf()->snextc())
            if(_Traits::eq_int_type(_Traits::eof(), _Meta))
                {   // end of file, quit
                _State |= ios_base::eofbit;
                break;
                }
            else if (_Ctype_fac.is(_Ctype::space,
                _Traits::to_char_type(_Meta)))
                break;  // whitespace, quit
            else
                {   // add character to string
                _Str.append(1, _Traits::to_char_type(_Meta));
                _Changed = true;
                }
        _CATCH_IO_(_Istr)
        }
 
    _Istr.width(0);
    if (!_Changed)
        _State |= ios_base::failbit;
    _Istr.setstate(_State);
    return (_Istr);
    }


Запускаете элементарный пример:
C++
1
2
3
4
5
6
7
8
#include <iostream>
#include <string>
 
int main()
{
    std::string s;
    std::cin >> s; // Здесь идете отладчиком внутрь
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2013, 23:08     Перегрузка оператора ввода
Еще ссылки по теме:

Перегрузка оператора ввода C++
Перегрузка оператора ввода вывода C++
C++ Перегрузка оператора ввода ,вывода

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
FreeMan108
 Аватар для FreeMan108
120 / 120 / 6
Регистрация: 04.03.2013
Сообщений: 368
28.11.2013, 23:08  [ТС]     Перегрузка оператора ввода #8
Всем большое спасибо. Разобрался. Нашел такую функцию realloc. Вот с помощью нею очень удобно заполнять динамический массив посимвольно. Да и с временным буфером тоже можно, как показали тесты - с помощью cin нельзя ввести более 2048 (примерно) байт информации, ну а это в общем не сильные накладки на память.
Yandex
Объявления
28.11.2013, 23:08     Перегрузка оператора ввода
Ответ Создать тему
Опции темы

Текущее время: 23:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru