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

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

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

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

11.04.2014, 13:44. Просмотров 786. Ответов 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 минут
Неужели задача такая сложная?
Лучшие ответы (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;//сколько элементов в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
11.04.2014, 14:44
  #2

Не по теме:

Цитата Сообщение от Ilot Посмотреть сообщение
Неужели задача такая сложная?
А зачем Вы о ней спрашиваете тогда?

Ilot
Модератор
Эксперт С++
1810 / 1167 / 227
Регистрация: 16.05.2013
Сообщений: 3,075
Записей в блоге: 5
Завершенные тесты: 1
11.04.2014, 15:02  [ТС] #3
Tulosba, ну очень смешно.
Пытался написать свой тип от char_traits, но вовремя понял, что ни к чему хорошему это не приведет.
EOF запрятан где-то очень глубоко в заголовочниках и как на него повлиять неизвестно.
Есть ли другой путь?
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.04.2014, 16:02 #4
Цитата Сообщение от Ilot Посмотреть сообщение
Есть ли другой путь?
Для чего? Чтобы не вводить ctrl+z для ввода признака окончания потока? Пример кода приведите.
Ilot
Модератор
Эксперт С++
1810 / 1167 / 227
Регистрация: 16.05.2013
Сообщений: 3,075
Записей в блоге: 5
Завершенные тесты: 1
14.04.2014, 09:06  [ТС] #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Для чего? Чтобы не вводить ctrl+z для ввода признака окончания потока?
Да, да именно для этого.
Цитата Сообщение от alsav22 Посмотреть сообщение
Пример кода приведите.
Если бы я мог привести пример кода то не задавал бы такой вопрос. А вообще-то вопрос можно перефразировать так - как заставить вот такую конструкцию завершать ввод при вводе '\n':
C++
1
std::copy(std::istreambuf_iterator<char>(std::cin), std::istreambuf_iterator<char>(), back_inserter(Container));
newbie666
Заблокирован
14.04.2014, 09:20 #6
Цитата Сообщение от Ilot Посмотреть сообщение
как заставить вот такую конструкцию завершать ввод при вводе '\n':
такую никак не заставишь.... зачем выпендрёж? проверяй ввод в цикле каком нибуть ...
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.04.2014, 11:05 #7
Цитата Сообщение от Ilot Посмотреть сообщение
Если бы я мог привести пример кода то не задавал бы такой вопрос.
Цитата Сообщение от Ilot Посмотреть сообщение
как заставить вот такую конструкцию завершать ввод при вводе '\n':
Это разве не пример?
Ilot
Модератор
Эксперт С++
1810 / 1167 / 227
Регистрация: 16.05.2013
Сообщений: 3,075
Записей в блоге: 5
Завершенные тесты: 1
14.04.2014, 12:26  [ТС] #8
Цитата Сообщение от newbie666 Посмотреть сообщение
такую никак не заставишь.... зачем выпендрёж? проверяй ввод в цикле каком нибуть ...
Потребность в этой хрени весьма прозаическая. Зачастую форматированный ввод совсем не требуется. Например пользователь вводит определенное число и програме требуется пропарсить его разряды. Обычно в таком случае вводят переменную числового типа, а затем в цикле делят его на 10. Вопрос зачем это делать если пользователь изначально задает число ввиде последовательности символов, которые я могу загнать например в строку или вектор, а также в свой класс, но для этого мне необходим посимвольный парсинг вводимой строки. Вот такие дела.
Цитата Сообщение от newbie666 Посмотреть сообщение
такую никак не заставишь....
На самом то деле заставить легко об этом я писал выше. Проблема возникает при связывании входного/выходного потоков с консолью. Т.о. мы опять возвращаемся к тому вопросу который я не так давно задавал и не получил на него ответа...
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.04.2014, 12:50 #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class T>
void my_copy(std::istreambuf_iterator<char> in, T& Container)
{
    while (true)
    {
        Container.push_back(*in++);
        if ((cin.rdbuf() ->in_avail()) == 0)
            break;
    }
}
 
vector <char> Container;
std::istreambuf_iterator<char> in(std::cin);
my_copy(in, Container);
Ilot
Модератор
Эксперт С++
1810 / 1167 / 227
Регистрация: 16.05.2013
Сообщений: 3,075
Записей в блоге: 5
Завершенные тесты: 1
14.04.2014, 13:19  [ТС] #10
А говорила мне мамка учи потоки жаль не послушался. Надо бы это исправить...
alsav22, спасибо, но вот только в вектор заносится только один символ... Да и насколько мне позволяет буржуский in_avail() возвращает кол-во символов которые еще остались в потоке. А ведь '\n' тоже простой символ, а именно его мне нужно отслеживать. Отсюда вопрос: есть ли возможность посимвольно читать буфер?

Добавлено через 6 минут
Неужели я такой дурак?
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <fstream>
int main()
{
    std::vector<char> Container;
    std::istreambuf_iterator<char> bcin(std::cin);
    while(*bcin != '\n') {
        Container.push_back(*bcin++);
    }
    std::copy(Container.begin(), Container.end(), std::ostream_iterator<char>(std::cout, ""));
    std::cout << std::endl;
    return 0;
}
alsav22, благодарю, что навели на мысль.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.04.2014, 13:33 #11
Цитата Сообщение от Ilot Посмотреть сообщение
спасибо, но вот только в вектор заносится только один символ..
Не пойму, о чём это?
Миниатюры
Признак окончания потока для буферного итератора  
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.04.2014, 13:35 #12
Чтобы '\n' не попал в контейнер:
C++
1
2
if ((cin.rdbuf()->in_avail()) == 1)
            break;
Добавлено через 47 секунд
Цитата Сообщение от Ilot Посмотреть сообщение
Отсюда вопрос: есть ли возможность посимвольно читать буфер?
Он посимвольно и читается.
Ilot
Модератор
Эксперт С++
1810 / 1167 / 227
Регистрация: 16.05.2013
Сообщений: 3,075
Записей в блоге: 5
Завершенные тесты: 1
14.04.2014, 13:57  [ТС] #13
Во!
Миниатюры
Признак окончания потока для буферного итератора  
DrOffset
7102 / 4243 / 952
Регистрация: 30.01.2014
Сообщений: 7,025
14.04.2014, 14:15 #14
Цитата Сообщение от Ilot Посмотреть сообщение
который я не так давно задавал и не получил на него ответа...
Странно. Вроде бы ты получил ответ, причем даже не один раз
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.04.2014, 14:52 #15
Цитата Сообщение от Ilot Посмотреть сообщение
Во!
Понял - это особенности mingw. Тогда добавить:
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
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
 
template <class T>
void my_copy(std::istreambuf_iterator<char> in, T& Container)
{
    while (true)
    {
        Container.push_back(*in++);
 
        if ((cin.rdbuf() ->in_avail()) == 1)
        break;
    }
}
 
int main()
{
    vector <char> Container;
 
    ios_base::sync_with_stdio(0); // !!!
    std::istreambuf_iterator<char> in(std::cin);
 
    my_copy(in, Container);
 
    for (int i = 0; i < Container.size(); ++i)
        cout << Container[i];
    cout << endl;
}
Миниатюры
Признак окончания потока для буферного итератора  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2014, 14:52
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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