Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 21.05.2016
Сообщений: 11
1

Детали относительно входного потока cin

28.05.2016, 13:13. Показов 3042. Ответов 52
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте)

у меня тут такая проблемка:

есть вот такой вот участок кода(в основной программе):

C++
1
2
3
//...
cout << "\t" << val_name << " [" << i+1 << "]= ";cin >> measur_val[i];cout << '\n';
//...
где measur_val[i] переменная типа float. Пока вводишь значения в консоли через точку - все в порядке. Проблемы начинаются, когда случайно вводишь запятую , ну или в общем случаи символ. тогда цикл, в котором эта строчка находится, начинает зацикливаться. Вот тут-то и сказывается непонимание потоков.

Как я понимаю система ввода организованна таким образом, что с помощью операционной системы информация с клавиатуры, с помощью сложной системы классов и шаблонов, записывается в память, называемой потоком, создавая объект. Потом перегруженный для объектов этого класса оператор ">>"(который читается, как писал Страуструп "прочесть из") и присваивает правому операнду значение из потока, являющегося левым операндом.

То есть поток - это обобщенная(шаблонная) иерархия классов построенная, используя общую логику обработки и хранения входных данных разных типов(или тип входных данных только символьный?[*]). А оператор ">>" выполняет запись данных из потокового объекта в другой объект.

Но апогеем моего понимания является вот эта программка:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <clocale>
#include <cstdlib>
using namespace std;
int main() {
    float a, b;
    char c;
    cin >> a;
    cout << a  << '\n';
    cin >> c;
    cout << c << '\n';
    system("pause");
    return 0;
}
где вводя, например, "10," в а запишется только 10, а запятая останется в потоке. Тогда в тот момент, когда выполняется чтение из потока в строчке 10, переменной с автоматически присвоится,оставшаяся в потоке, запятая. Откуда можно сделать вывод что входные данные организуются в потоке cin в порядке очереди.

Но я не понимаю что происходит в ситуациях, когда, допустим:
-все переменные в программе числового типа, а при чтении из потока там обнаруживается символьный тип;
-или когда числовая переменная читает из потока в цикле(когда происходит зацикливание).
и как бороться с этими ситуациями.

В общем можете пожалуйста дать ответ на вопросы:
1. правильное ли у меня понимание потока(и вопрос со звездочкой[*])? И если тип один то как происходит идентификация и конвертация из символьного типа в другие?путем перегрузки?
2. правильно ли я понимаю роль операционной системы в этом вопросе: что она является посредником между клавиатурой и ячейкой потоковой памяти?
3. что происходит когда тип значения находящегося в потоке и тип переменной не совпадают?
4. как справится с этими ситуациями?

P.S. Извиняюсь за такую кашу. Просто у меня у самого уже в голове каша, а разобраться никак не могу(
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2016, 13:13
Ответы с готовыми решениями:

Слова входного потока
Вывести самые длинные слова входного потока! если во вх потоке самое длинное слово одно,то...

Считывание до конца входного потока
Что значит считывание данных до конца входного потока? Знаю, что на C++ реализуется так. А что...

Чтение файла из входного потока
есть код в нем есть путь к файлу, как мне сделать так чтоб я не писал путь к файлу а данные...

Проверка входного потока на ошибки
Ребяты подскажите плз )))) сам не как не разберусь можно ли использовать failbit badbit goodbit...

52
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
29.05.2016, 09:54 21
Author24 — интернет-сервис помощи студентам
Вы исходный пост не забыли? "Входным потоком называется парсер сырого текста, внутри которого лежит ссылка на внешнюю читалку этого самого текста.".

Еще раз: входной поток в C++, это std::istream. std::istream - парсер.текста. Читать этот текст он не умеет, для этого ему нужен внешний объект std::streambuf.
std::streambuf. - читалка сырых данных виртуальными методами. Парсить текст она не умеет. Вот вообще не умеет.
"Разная сущность" же потоков сводится исключительно к тому, что они передают std::istream разных потомков std::streambuf.
0
Заблокирован
29.05.2016, 09:57 22
http://www.cplusplus.com/refer... m/filebuf/ filebuf - есть реализация потоковго i/o(!) а не fstream/ostream которые как было сказано выше являются классами обертками у которых filebuf является полем(возможность вернуть указатель говорит об этом). Так вот эти обёрки уже имеют текстовые анализаторы, но речь шла сейчас о базовом потоков классе, поэтому советую разобраться в стркое помеченной ахалай махалай потом писать что либо.

Добавлено через 2 минуты
Цитата Сообщение от Unknownx Посмотреть сообщение
class mystream{
- эквивалент filebuf
Цитата Сообщение от Unknownx Посмотреть сообщение
class cmycin : public mystream{
- эквивалент ostream/fstream заканчиваем спор.
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
29.05.2016, 09:58 23
Цитата Сообщение от Unknownx Посмотреть сообщение
Так вот эти обёрки уже имеют текстовые анализаторы
Еще раз, очень медленно: "текстовый анализатор" AKA std::istream::operator>> унаследован от istream. Это метод базового класса, а не оберток.
0
Заблокирован
29.05.2016, 10:02 24
Поток должен выполнять единственную роль - обеспечить доступ и чтение/запись, не более. Всё что выше может иметь текстовый анализатор и т.д, но будет наследником/обёрткой(декором) над базовым потоковым классом.

Добавлено через 45 секунд
Renji, прочти немного про патерн декорирования

Добавлено через 1 минуту
Это вдруг не хочешь читать книг
Декоратор следует интерфейсу декорируемого компонента, поэтому его присутствие
прозрачно для клиентов компонента. Например, таким образом можно добавить
рамку к графическому объекту. Декоратор переадресует запросы внутреннему
компоненту, а также может выполнять дополнительные действия. Декораторы
могут вкладываться друг в друга, это позволяет сочетать дополнительные обязанности
произвольным образом. Компоненты и их декораторы должны быть
наследниками одного класса, который следует делать максимально легким, то
есть задавать в нем в основном не данные, а интерфейс.
- так вот fstream/ostream декораторы над filebuf заканчивай нести чушь.
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
29.05.2016, 10:04 25
Цитата Сообщение от Unknownx Посмотреть сообщение
Декоратор переадресует запросы внутреннему
компоненту, а также может выполнять дополнительные действия.
Еще раз, медленно. "Внутреннему компоненту" (streambuf) запросы переадресует базовый класс std::istream. В потомках std::istream нет не то что переадресации чего-то там, а даже реализации форматированного чтения/записи (operator>>/operator<<) как таковой. Она тупо наследуется от базового класса.
0
Заблокирован
29.05.2016, 10:14 26
Renji, разговор бессмысленен, я не хочу переходить на личности, выше всё написано что либо пояснять более нет желания по причине низкой квалификации слушателей.
Цитата Сообщение от Renji Посмотреть сообщение
класс std::istream
istream вообще относится к cout мы же говорили о cin т.е ostream
http://www.cplusplus.com/refer... m/ostream/
http://www.cplusplus.com/refer... m/istream/
но без обид тебе ничего не доказать т.к даже открывая ссылки не видишь что сидит вначале декораторов и что есть потоковый класс, а что декоратор, пребывай в святом неведении дальше.

Добавлено через 5 минут

Не по теме:

Всё таки надеюсь достучусь http://www.cplusplus.com/refer... m/filebuf/ - вот базовый потоковый класс, всё что выше сделано наследником от fstream и содержит filebuf как поинтер котрый можно свопить обеспечивая тем гибкость декораторов над filebuf.

0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
29.05.2016, 10:16 27
Цитата Сообщение от Unknownx Посмотреть сообщение
Всё таки надеюсь достучусь http://www.cplusplus.com/refer... m/filebuf/ - вот базовый потоковый класс
filebuf - потомок std::streambuf, который является цитирую "base virtual class for all stream buffer". Переименовать stream buffer в поток это, конечно, круто. Давайте еще двигатель внутреннего сгорания автомобилем назовем.
0
Заблокирован
29.05.2016, 10:22 28
Renji, как ты думаешь почему в названии записано
stream buffer
Читать надо не как буффер потока а как потоквый буффер, потмоу как говорилось всё является буфферзированным. Если пойти далее, источником данных являются консоль, некое устройство ввода, файл. Т.е наш потоквый буффер является декоратором как минимум для stringio и fileio и имеет внутренний буффер.
, но я уже всё сказал выше.
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
29.05.2016, 10:31 29
Цитата Сообщение от Unknownx Посмотреть сообщение
Renji, как ты думаешь почему в названии записано stream buffer
Потому что он предназначен для использования в базовом stream, который и строит все "декорации". То что на коробке написано "cat food", еще не повод говорить что в коробке сидит кошка.
И извините, но когда говорят "функция работает с потоком", подразумевают что ей передается std::istream, а не с std::streambuf. Так что не надо выдумывать свою собственную классификацию.
0
Unknownx
29.05.2016, 10:46
  #30

Не по теме:

Renji, мне уже смешно от твоих попыток отстоять "твою правду":)
Хорошо поправлю твои знания и английского буффер потка(т.е буффер который принадлежит потоку, будет идти как stream's buffer) потоквый буффер будет stream buffer. Идём далее, твои слова

Цитата Сообщение от Renji Посмотреть сообщение
Входным потоком называется парсер сырого текста, внутри которого лежит ссылка на внешнюю читалку этого самого текста.
- вот ты сам говоришь что читалка текста лежит внутри, читалка текста и есть потковый класс. Всё что выше декорация со специфическим функционалом. Читалки бывают разными - из текстовго блока и из файла, тоже тебе написал
Цитата Сообщение от Unknownx Посмотреть сообщение
Т.е наш потоквый буффер является декоратором как минимум для stringio и fileio и имеет внутренний буффер.
но у тебя огромное желание спорить.
Давай пойдём ещё дальше, возьмём FILE * это ведь тоже поток, только в Сишном стиле, скажи там есть какой то функционал по парсингу?
Уймись, ты не прав, либо признай хотябы для себя, что заблуждался и пойдём дальше. По всему что у тебя писано видно что потковых классов ты не делал, потому давай не кривить душой, ведь я же прав.

0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
29.05.2016, 10:53 31
Цитата Сообщение от Unknownx Посмотреть сообщение
Хорошо поправлю твои знания и английского буффер потка(т.е буффер который принадлежит потоку, будет идти как stream's buffer) потоквый буффер будет stream buffer.
"All stream objects, no matter whether buffered or unbuffered, have an associated stream buffer:".
Еще раз говорю, не надо выдумывать свои классификации. По документации stream buffer это именно что объект ассоциированный с потоком, а не поток как таковой.
0
Заблокирован
29.05.2016, 10:58 32
Renji, ну и как ты думаешь почему буфферизированный и не буфферизированные объекты всегда имеют асоциированную с ними сущность?Как видишь ты сам же написал что буффер потока сюда не применим, потоквый буффер да, т.е он может читать по 1 му символу всего без буффера, но этот объект читает а не его наследник и этот объект не имеет лексического парсера, а имеет его наследник. Вдобавок ты ещё не ответил на мой вопрос
Цитата Сообщение от Unknownx Посмотреть сообщение
Давай пойдём ещё дальше, возьмём FILE * это ведь тоже поток, только в Сишном стиле, скажи там есть какой то функционал по парсингу?
Пишу это "для тех кто в танке", ранее написал, что потоковым классом является именно filebuf, а не его наследники и что данная сущность призвана лишь прочитать а не разобрать, ты написал что поток всегда должен иметь лексический анализатор, что есть ерись. К чему тут есть вопросы?
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
29.05.2016, 11:08 33
Слушайте, ну перестаньте издеваться над русским языком. По-русски "буфер" с одним фэ пишется.
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
29.05.2016, 11:10 34
Цитата Сообщение от Unknownx Посмотреть сообщение
ты написал что поток всегда должен иметь лексический анализатор, что есть ерись.
Здесь вообще-то, тема по C++. Поэтому обсуждаем потоки C++, а не потоки Си или потоки воздуха в аэродинамической трубе. И конкретно в C++ да, сущность называемая в документации потоком (std::istream) всегда имеет лексический анализатор. Потому как так написано в документации к этой сущности.
Цитата Сообщение от Unknownx Посмотреть сообщение
Renji, ну и как ты думаешь почему буфферизированный и не буфферизированные объекты всегда имеют асоциированную с ними сущность?
Потому что (нормальные) потоковые функции работают не с буферизированными объектами, а с абстрактным std::istream. Надо же им как-то из этого абстрактного std::istream, достучаться до конкретной читалки сырого текста. Вот в объект ссылку на читалку и впилили. Хотя, как по мне, лучше бы делали это через виртуальные функции std::istream.
0
Заблокирован
29.05.2016, 11:19 35
Цитата Сообщение от Renji Посмотреть сообщение
Поэтому обсуждаем потоки C++, а не потоки Си или потоки воздуха в аэродинамической трубе. И конкретно в C++ да, сущность называемая в документации потоком (std::istream) всегда имеет лексический анализатор. Потому как так написано в документации к этой сущности.
- т.е потоковый клас не существует без текстового анализатор, нука нука где именно это написано, мне уже интересно?
Си является базой для С++ т.е всё что мы видим в плюсах имеет в своей основе завёрнутый Си
Цитата Сообщение от Renji Посмотреть сообщение
Потому что (нормальные) потоковые функции работают не с буферизированными объектами, а с абстрактным std::istream
Отойдём в сторону, ostream тоже по вашему базовый потоковый класс, он имеет лексический анализатор?Пересать писать чушь!

Добавлено через 2 минуты
Базовый потоковый класс filebuf или по крайней мере его предок, но ни как не декорации над ним, хорош уже!
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
29.05.2016, 11:21 36
Цитата Сообщение от Unknownx Посмотреть сообщение
- где именно написано?
"Input stream objects can read and interpret input from sequences of characters. Specific members are provided to perform these input operations (see functions below)."
Цитата Сообщение от Unknownx Посмотреть сообщение
Отойдём в сторону ostream тоже по вашему базовый потоковый класс, он имеет лексический анализатор?
Изначально у меня пост был про входной поток, так что не надо придираться к словам. ostream же имеет сериализатор, переводящий данные в текст.
0
Заблокирован
29.05.2016, 11:27 37
Renji, "Input stream objects являются большой надстройкой над filebuf(который конкретно и читает и если надо буферизирует), эти большие надстройки содержат уже парсеры/интерпритаторы и т.д(которые являются отдельными сущностями). Поток - это filebuf(хорошо докажи обратное, я послушаю) , лексический анализатор ты даже не видишь(он вообще впаян), накой мешаешь сущности в одну их, даже идиоту видно, что как минимум две, нет надо холиворить, ну холиворь уже без меня, я потерял всякий интерес к дискусии.
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
29.05.2016, 11:29 38
Цитата Сообщение от Unknownx Посмотреть сообщение
Поток - это streambuf (хорошо докажи обратное, я послушаю)
Доказывает утверждение тот, кто его делает. Покажи место в документации где streambuf называют именно stream object, а не stream buffer, будет о чем говорить. Иначе, повторюсь, кошачий корм тоже называют cat food, но кошкой он этого не становится.
0
Заблокирован
29.05.2016, 11:31 39
Зачем ходить далеко, вот ещё пример потока
https://blog.didierstevens.com... m-objects/, т.е поток - это просто набор данных либо в памяти либо на HDD , потоковый класс обеспечивает доступ к этим данным не более, а уже декорации предают потоковму классу конкретную специализацию
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
29.05.2016, 11:34 40
Цитата Сообщение от Unknownx Посмотреть сообщение
Зачем ходить далеко, вот ещё пример потока
И вот пример потока (жидкости).
Еще раз повторяю, мы обсуждаем потоки C++, а не потоки PDF или потоковые сокеты Беркли.
0
29.05.2016, 11:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.05.2016, 11:34
Помогаю со студенческими работами здесь

Работа стандартного входного потока
Здравствуйте. Допустим есть код: int number1, number2; std::cin &gt;&gt; number1 &gt;&gt; number2; Мы...

Как работает cin.peek, cin,get, cin.ignore, cin.clear?
Здравствуйте, товарищи и не товарищи!:) Я только начал изучать C++, а уже использую вещи, которые...

Очистка входного потока (cin или stdin)
ПОМОГИТЕ ПОЖАЛУЙСТА!!!! Делаю программу под консоль в линуксе, запрашиваю с клавиатуры имя файла....

Подсчет входного потока
Здравствуйте. Начал ознакомление с легендарным языком и сразу же столкнулся с, казалось бы,...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru