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

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

Войти
Регистрация
Восстановить пароль
 
 
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
#1

Признак окончания потока для буферного итератора - C++

11.04.2014, 13:44. Просмотров 825. Ответов 25
Метки нет (Все метки)

Собственно надоело вводить ctrl+z для ввода признака окончания потока, засим возник вопрос а возможно ли изменить этот самый признак для буферного итератора?
Взглянул на заголовочники - узрел эти конструкторы:
C++
1
2
3
4
5
6
7
8
9
10
11
      ///  Construct end of input stream iterator.
      istreambuf_iterator() throw()
      : _M_sbuf(0), _M_c(traits_type::eof()) { }
 
      ///  Construct start of input stream iterator.
      istreambuf_iterator(istream_type& __s) throw()
      : _M_sbuf(__s.rdbuf()), _M_c(traits_type::eof()) { }
 
      ///  Construct start of streambuf iterator.
      istreambuf_iterator(streambuf_type* __s) throw()
      : _M_sbuf(__s), _M_c(traits_type::eof()) { }
Таким образом получается необходимо что бы traits_type::eof() возвращало к примеру '\n' и что бы все это работало со стандартными потоками. Как бы это сделать?
(traits_type это шаблон char_traits)

Добавлено через 2 часа 10 минут
Неужели задача такая сложная?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2014, 13:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Признак окончания потока для буферного итератора (C++):

Не работает признак окончания ввода(признак-0) - C++
Признак окончания ввода 0; подскажите люди добрые что не так?) #include <iostream> #include<stdio.h> using namespace std; int...

Бинарные файлы. Признак окончания файла - C++
Здравствуйте Возникла проблема при чтении с бинарного файла, программа не может найти конец файла (точнее я не могу :jokingly:)...

С клавиатуры вводятся последовательность целых чисел 0 - признак окончания последовательности - C++
определит ьверно ли утверждение количество нечетных чисел последовательности меньше количества четных... ноль не учитывается

С клавиатуры вводятся последовательность целых чисел.0 - признак окончания последовательности - C++
С клавиатуры вводятся последовательность целых чисел.0 - признак окончания последовательности.Определить,верно ли утверждение : в...

Написание итератора для списка - C++
Приветствую. Вот собственно реализация списка: #include "stdafx.h" #include <iostream> #include <cstring> using namespace std; ...

итератора для собственного вектора - C++
помогите пожалуйста сделать итератор для вектора template <class T> class myvector { private: int top;//сколько элементов в...

25
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
14.04.2014, 15:05  [ТС] #16
Цитата Сообщение от DrOffset Посмотреть сообщение
Странно. Вроде бы ты получил ответ, причем даже не один раз
Может быть. Однако таки не был получен ответ на вопрос как связать буфер с входным/выходным потоками консоли. И на самом деле только ваше последнее сообщение более мение соответствовало сути вопроса, предыдущие ответы не соответствовали самой постановке вопроса в плане использования пользовательского типа символом. А вот код в последнем посте к сожалению не связывает буфер с выходным потоком. Вот такие дела.

Добавлено через 2 минуты
alsav22, как я понял это синхронизация со стандартными потоками С. А можете поподробнее разъяснить в чем собственно тонкость?
0
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
14.04.2014, 15:13 #17
Цитата Сообщение от Ilot Посмотреть сообщение
А вот код в последнем посте к сожалению не связывает буфер с выходным потоком
Я предполагал, что ты сможешь это сделать самостоятельно. Нужно было только реализовать должным образом класс console_buffer. Именно он и связывает с консолью. Если это было не понятно из моего ответа, то стоило спросить
А по текущей теме можно предложить еще реализовать свой собственный итератор, который умеет собственный eof:
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
template <typename CharT, typename Traits = std::char_traits<CharT> >
class endline_iterator
    : public std::iterator<std::input_iterator_tag, CharT, typename Traits::off_type, CharT *, CharT &>
{
public:
    typedef CharT                                   char_type;
    typedef Traits                                  traits_type;
    typedef typename Traits::int_type               int_type;
    typedef std::basic_streambuf<CharT, Traits>     streambuf_type;
    typedef std::basic_istream<CharT, Traits>       istream_type;
 
private:
    mutable streambuf_type *  sbuf;
    mutable int_type          c;
 
public:
    endline_iterator() throw()
        : sbuf(0), c(eof_value())
    { }
 
    endline_iterator(istream_type & s) throw()
        : sbuf(s.rdbuf()), c(eof_value())
    { }
 
    endline_iterator(streambuf_type * s) throw()
        : sbuf(s), c(eof_value())
    { }
 
    char_type operator*() const
    {
        return traits_type::to_char_type(get());
    }
 
    endline_iterator & operator++()
    {
        if(sbuf)
        {
            sbuf->sbumpc();
            c = eof_value();
        }
        return *this;
    }
 
    endline_iterator operator++(int)
    {
        endline_iterator old = *this;
        if(sbuf)
        {
            old.c = sbuf->sbumpc();
            c = eof_value();
        }
        return old;
    }
 
    bool equal(endline_iterator const & b) const
    {
        return at_eof() == b.at_eof();
    }
 
private:
    static int_type eof_value() // eof - это конец строки
    {
        return int_type('\n');
    }
 
    int_type get() const
    {
        const int_type eof = eof_value();
        int_type ret = eof;
        if(sbuf)
        {
            if (!traits_type::eq_int_type(c, eof))
                ret = c;
            else if (!traits_type::eq_int_type((ret = sbuf->sgetc()), eof))
                c = ret;
            else
                sbuf = 0;
        }
        return ret;
    }
 
    bool at_eof() const
    {
        const int_type eof = eof_value();
        return traits_type::eq_int_type(get(), eof);
    }
};
 
template<typename CharT, typename Traits>
inline 
bool operator==(endline_iterator<CharT, Traits> const & a,
           endline_iterator<CharT, Traits> const & b)
{
    return a.equal(b);
}
 
template<typename CharT, typename Traits>
inline
bool operator!=(endline_iterator<CharT, Traits> const & a,
                endline_iterator<CharT, Traits> const & b)
{
    return !a.equal(b);
}
Добавлено через 4 минуты
Вызов соответственно будет такой:
C++
1
std::copy(endline_iterator<char>(std::cin), endline_iterator<char>(), std::back_inserter(Container));
2
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
14.04.2014, 15:16  [ТС] #18
Цитата Сообщение от DrOffset Посмотреть сообщение
Я предполагал, что ты сможешь это сделать самостоятельно. Нужно было только реализовать должным образом класс console_buffer. Именно он и связывает с консолью.
Вот именно в этом и состоял вопрос. Если бы я знал как это сделать то, по-видимому, не создавал бы тему.
Цитата Сообщение от DrOffset Посмотреть сообщение
А по текущей теме можно предложить еще реализовать свой собственный итератор, который умеет собственный eof:
Не думаю, что стоит так усложнять задачу ради одного метода. К тому же более простое решение указанно в одном из моих последних сообщений, но все равно спасибо.
Вообще-то достаточно просто перегрузить констукторы.
0
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
14.04.2014, 15:21 #19
Цитата Сообщение от Ilot Посмотреть сообщение
Не думаю, что стоит так усложнять задачу ради одного метода.
Это зависит от ситуации. Допустим здесь и не стоит, в целях самообразования разве что

Добавлено через 55 секунд
Цитата Сообщение от Ilot Посмотреть сообщение
Вот именно в этом и состоял вопрос. Если бы я знал как это сделать то, по-видимому, не создавал бы тему.
Если интересно, то вечером могу показать пример.
1
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.04.2014, 15:26 #20
Цитата Сообщение от Ilot Посмотреть сообщение
как я понял это синхронизация со стандартными потоками С. А можете поподробнее разъяснить в чем собственно тонкость?
Без понятия, просто на практике столкнулся (в студии всё работает и так). Это, скорее, вопрос к знатокам gcc и Linux (так как именно там без этого не работает).
1
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
14.04.2014, 15:35 #21
Цитата Сообщение от Ilot Посмотреть сообщение
Вообще-то достаточно просто перегрузить констукторы.
Где?

Добавлено через 4 минуты
Цитата Сообщение от alsav22 Посмотреть сообщение
ios_base::sync_with_stdio
Эта штука синхронизирует потоки стандартной библиотеки С++ и С. В каком порядке вызываются запись или чтение через них, в таком и будут производиться операции, если синхронизации нет, то потоки С и С++ могут (но не должны) работать независимо.
1
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
14.04.2014, 15:44  [ТС] #22
Цитата Сообщение от DrOffset Посмотреть сообщение
Где?
Ага поспешил...
Цитата Сообщение от DrOffset Посмотреть сообщение
Эта штука синхронизирует потоки стандартной библиотеки С++ и С. В каком порядке вызываются запись или чтение через них, в таком и будут производиться операции, если синхронизации нет, то потоки С и С++ могут (но не должны) работать независимо.
Это я уже нагуглил. Вопрос в том какое отношение эта хрень имеет к буферным итераторам? Пока, что я search...
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.04.2014, 15:53 #23
Цитата Сообщение от Ilot Посмотреть сообщение
Вопрос в том какое отношение эта хрень имеет к буферным итераторам?
Интересно, что если эту строчку поместить после объявления итератора, то ввод зависает.
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
14.04.2014, 16:20  [ТС] #24
Цитата Сообщение от alsav22 Посмотреть сообщение
Интересно, что если эту строчку поместить после объявления итератора, то ввод зависает.
Может быть поэтому:
Вызвав функцию sync_with_stdio(), можно безопасно использовать стандартную С-подобную систему ввода-вывода в согласии с опирающейся на классы системой ввода-вывода C++. Чтобы отключить синхронизацию, передайте функции sync_with_stdio() значение false. Функция возвращает предыдущую установку: значение true означает синхронизацию, а значение false — ее отсутствие. По умолчанию стандартные потоки синхронизированы. Эта функция достоверна только в случае, если она вызывается до выполнения любых других операций ввода-вывода.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.04.2014, 17:57 #25
Цитата Сообщение от Ilot Посмотреть сообщение
до выполнения
А где там начинается выполнение?
0
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
14.04.2014, 17:59 #26
Цитата Сообщение от alsav22 Посмотреть сообщение
А где там начинается выполнение?
Ну посмотри хотя бы на мой вариант итератора. Он идентичен стандартному за исключением символа eof.
C++
1
2
3
endline_iterator(istream_type & s) throw()
     : sbuf(s.rdbuf()), c(eof_value())
{ }
rdbuf() видишь?
1
14.04.2014, 17:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2014, 17:59
Привет! Вот еще темы с ответами:

Класс итератора для класса вектора - C++
Необходимо реализовать собственный класс итератора для прохода по вектору, с перегрузкой оператора ++ - переход к следующему элементу и --...

Ошибка в перегрузке операторов для класса - итератора - C++
Добрый вечер. Есть заготовка программы для работы с матрицей, построенной из узлов с четырьмя связями (вверх, вниз, влево, вправо)....

Создание итератора для дерева общего вида - C++
Возникла такая проблема: надо сделать итератор для дерева общего вида. Я не знаю, как его лучше сделать. Если кто-то с этим сталкивался,...

Использование потокового итератора для пользовательских обьектов - C++
Надо с помощю итератора ofstream_iterator вывести содержимое множины, в которой есть обьекты пользовательського типа. Вот что я пока...


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Опции темы

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