0 / 0 / 0
Регистрация: 21.05.2016
Сообщений: 11
|
|||||||||||
1 | |||||||||||
Детали относительно входного потока cin28.05.2016, 13:13. Показов 3042. Ответов 52
Метки нет (Все метки)
Здравствуйте)
у меня тут такая проблемка: есть вот такой вот участок кода(в основной программе):
Как я понимаю система ввода организованна таким образом, что с помощью операционной системы информация с клавиатуры, с помощью сложной системы классов и шаблонов, записывается в память, называемой потоком, создавая объект. Потом перегруженный для объектов этого класса оператор ">>"(который читается, как писал Страуструп "прочесть из") и присваивает правому операнду значение из потока, являющегося левым операндом. То есть поток - это обобщенная(шаблонная) иерархия классов построенная, используя общую логику обработки и хранения входных данных разных типов(или тип входных данных только символьный?[*]). А оператор ">>" выполняет запись данных из потокового объекта в другой объект. Но апогеем моего понимания является вот эта программка:
Но я не понимаю что происходит в ситуациях, когда, допустим: -все переменные в программе числового типа, а при чтении из потока там обнаруживается символьный тип; -или когда числовая переменная читает из потока в цикле(когда происходит зацикливание). и как бороться с этими ситуациями. В общем можете пожалуйста дать ответ на вопросы: 1. правильное ли у меня понимание потока(и вопрос со звездочкой[*])? И если тип один то как происходит идентификация и конвертация из символьного типа в другие?путем перегрузки? 2. правильно ли я понимаю роль операционной системы в этом вопросе: что она является посредником между клавиатурой и ячейкой потоковой памяти? 3. что происходит когда тип значения находящегося в потоке и тип переменной не совпадают? 4. как справится с этими ситуациями? P.S. Извиняюсь за такую кашу. Просто у меня у самого уже в голове каша, а разобраться никак не могу(
0
|
28.05.2016, 13:13 | |
Ответы с готовыми решениями:
52
Слова входного потока Считывание до конца входного потока Чтение файла из входного потока Проверка входного потока на ошибки |
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
29.05.2016, 09:54 | 21 |
Вы исходный пост не забыли? "Входным потоком называется парсер сырого текста, внутри которого лежит ссылка на внешнюю читалку этого самого текста.".
Еще раз: входной поток в 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 минуты - эквивалент filebuf - эквивалент ostream/fstream заканчиваем спор.
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
29.05.2016, 09:58 | 23 |
Еще раз, очень медленно: "текстовый анализатор" AKA std::istream::operator>> унаследован от istream. Это метод базового класса, а не оберток.
0
|
Заблокирован
|
|
29.05.2016, 10:02 | 24 |
Поток должен выполнять единственную роль - обеспечить доступ и чтение/запись, не более. Всё что выше может иметь текстовый анализатор и т.д, но будет наследником/обёрткой(декором) над базовым потоковым классом.
Добавлено через 45 секунд Renji, прочти немного про патерн декорирования Добавлено через 1 минуту Это вдруг не хочешь читать книг
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
29.05.2016, 10:04 | 25 |
Еще раз, медленно. "Внутреннему компоненту" (streambuf) запросы переадресует базовый класс std::istream. В потомках std::istream нет не то что переадресации чего-то там, а даже реализации форматированного чтения/записи (operator>>/operator<<) как таковой. Она тупо наследуется от базового класса.
0
|
Заблокирован
|
|
29.05.2016, 10:14 | 26 |
Renji, разговор бессмысленен, я не хочу переходить на личности, выше всё написано что либо пояснять более нет желания по причине низкой квалификации слушателей.
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 |
filebuf - потомок std::streambuf, который является цитирую "base virtual class for all stream buffer". Переименовать stream buffer в поток это, конечно, круто. Давайте еще двигатель внутреннего сгорания автомобилем назовем.
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
29.05.2016, 10:31 | 29 |
Потому что он предназначен для использования в базовом stream, который и строит все "декорации". То что на коробке написано "cat food", еще не повод говорить что в коробке сидит кошка.
И извините, но когда говорят "функция работает с потоком", подразумевают что ей передается std::istream, а не с std::streambuf. Так что не надо выдумывать свою собственную классификацию.
0
|
|
29.05.2016, 10:46
#30
|
Не по теме: Renji, мне уже смешно от твоих попыток отстоять "твою правду":) Давай пойдём ещё дальше, возьмём FILE * это ведь тоже поток, только в Сишном стиле, скажи там есть какой то функционал по парсингу? Уймись, ты не прав, либо признай хотябы для себя, что заблуждался и пойдём дальше. По всему что у тебя писано видно что потковых классов ты не делал, потому давай не кривить душой, ведь я же прав.
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
29.05.2016, 10:53 | 31 |
"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 му символу всего без буффера, но этот объект читает а не его наследник и этот объект не имеет лексического парсера, а имеет его наследник. Вдобавок ты ещё не ответил на мой вопрос
Пишу это "для тех кто в танке", ранее написал, что потоковым классом является именно 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 |
Здесь вообще-то, тема по C++. Поэтому обсуждаем потоки C++, а не потоки Си или потоки воздуха в аэродинамической трубе. И конкретно в C++ да, сущность называемая в документации потоком (std::istream) всегда имеет лексический анализатор. Потому как так написано в документации к этой сущности.
Потому что (нормальные) потоковые функции работают не с буферизированными объектами, а с абстрактным std::istream. Надо же им как-то из этого абстрактного std::istream, достучаться до конкретной читалки сырого текста. Вот в объект ссылку на читалку и впилили. Хотя, как по мне, лучше бы делали это через виртуальные функции std::istream.
0
|
Заблокирован
|
|
29.05.2016, 11:19 | 35 |
- т.е потоковый клас не существует без текстового анализатор, нука нука где именно это написано, мне уже интересно?
Си является базой для С++ т.е всё что мы видим в плюсах имеет в своей основе завёрнутый Си Отойдём в сторону, ostream тоже по вашему базовый потоковый класс, он имеет лексический анализатор?Пересать писать чушь! Добавлено через 2 минуты Базовый потоковый класс filebuf или по крайней мере его предок, но ни как не декорации над ним, хорош уже!
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
29.05.2016, 11:21 | 36 |
"Input stream objects can read and interpret input from sequences of characters. Specific members are provided to perform these input operations (see functions below)."
Изначально у меня пост был про входной поток, так что не надо придираться к словам. 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 |
Доказывает утверждение тот, кто его делает. Покажи место в документации где 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 |
И вот пример потока (жидкости).
Еще раз повторяю, мы обсуждаем потоки C++, а не потоки PDF или потоковые сокеты Беркли.
0
|
29.05.2016, 11:34 | |
29.05.2016, 11:34 | |
Помогаю со студенческими работами здесь
40
Работа стандартного входного потока Как работает cin.peek, cin,get, cin.ignore, cin.clear? Очистка входного потока (cin или stdin) Подсчет входного потока Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |