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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
FreeMan108
121 / 121 / 6
Регистрация: 04.03.2013
Сообщений: 370
#1

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

27.11.2013, 21:30. Просмотров 440. Ответов 7
Метки нет (Все метки)

Добрый вечер, уважаемые форумчане. Возник вопрос о перегрузке оператора ввода.

Имеется класс 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? Полагаю, что есть способ более эффективный.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2013, 21:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка оператора ввода (C++):

Перегрузка оператора ввода - C++
Данные вводятся в виде std::istream& operator >> (std:: istream& in,const Przedzial& pol) { in >> ""; return in; } Но...

Перегрузка оператора ввода - C++
Добрый день, есть вот такая штуковина: // в M.matrix лежат значения элементов матрицы // цикл по 4, потому что квадратная их 4-х...

Перегрузка оператора ввода - C++
почему не работает следующий код? class obj { unsigned int book_id; string title; unsigned price; public: obj(string i =...

Перегрузка оператора ввода - C++
Всем привет. Я хочу попробовать написать свой класс string. Вот пока собственно класс:class string { private: char* str; ...

Перегрузка оператора ввода >> - C++
При компиляции выдает такие ошибки, не могу разобраться в чем проблема. Ошибка LNK2019 ссылка на неразрешенный внешний символ...

Перегрузка оператора ввода и наследование - C++
Добрый день! Обращаюсь по такому поводу. Есть одна программа, в которой требуется перегрузить операторы ввода.вывода для одного из...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.11.2013, 22:04 #2
Цитата Сообщение от FreeMan108 Посмотреть сообщение
Ну а что если длина строки больше 100? Полагаю, что есть способ более эффективный.
Читать посимвольно. Посмотрите на реализацию operator>> для std::string в Вашем компиляторе.
1
FreeMan108
121 / 121 / 6
Регистрация: 04.03.2013
Сообщений: 370
27.11.2013, 22:26  [ТС] #3
Цитата Сообщение от Tulosba Посмотреть сообщение
Читать посимвольно.
Читать посимвольно это да, но как это дело занести в динамический массив непонятно. Его же размер нужно менять (увеличивать на 1) после каждого символа, а как это сделать.

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

Цитата Сообщение от FreeMan108 Посмотреть сообщение
Где ее смотреть? Есть же только интерфейс класса.
std::string шаблонный класс, а значит доступен в виде исходников. Пройдитесь отладчиком и всё увидите.
1
FreeMan108
121 / 121 / 6
Регистрация: 04.03.2013
Сообщений: 370
28.11.2013, 22:13  [ТС] #6
Что-то ничего не нашел. Можно ссылку на ресурс или исходный код.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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; // Здесь идете отладчиком внутрь
}
1
FreeMan108
121 / 121 / 6
Регистрация: 04.03.2013
Сообщений: 370
28.11.2013, 23:08  [ТС] #8
Всем большое спасибо. Разобрался. Нашел такую функцию realloc. Вот с помощью нею очень удобно заполнять динамический массив посимвольно. Да и с временным буфером тоже можно, как показали тесты - с помощью cin нельзя ввести более 2048 (примерно) байт информации, ну а это в общем не сильные накладки на память.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2013, 23:08
Привет! Вот еще темы с ответами:

Перегрузка оператора ввода, ошибка - C++
struct date_of_birth { int year; int month; int day; date_of_birth(int year =0, int month =0, int day =0):year(year),...

Перегрузка оператора ввода ,вывода - C++
Вообщем проблема такая есть класс в нем приват поля и перегружены 2 дружественных оператора ввода вывода, все хорошо, но дружественный...

Перегрузка оператора ввода вывода - C++
Есть два хэдера(header.h и Array.h) и исполняемая программа main.cpp в которой я как раз и обращаюсь к оператору ввода Array.h ...

Перегрузка оператора ввода вне класса - C++
вечер добрый. можно ли так делать? #include &lt;iostream&gt; struct point { int x, y; }; std::istream &amp; operator &gt;&gt;...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.11.2013, 23:08
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru