|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
31.12.2011, 21:26 | #1 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Внутренняя реализация std::cin
Мне нужно понять, каким образом cin активирует устройство ввода.
Скажу сразу, прежде чем создать эту тему, я очень много гуглил, прочел тонну литературы, пытался различными способами решить проблему самостоятельно. Но пока безрезультатно. Что бы доступно объяснить суть вопроса, лучше сразу покажу на примере. Допустим, имеется вот такой код: Код:
Суть вопроса заключается в следующем: istream это просто механизм, который осуществляет взаимодействие между реальным устройством ввода, и целевой программой. cin внутри себя каким то образом "настроен" на устройство ввода. И когда запускается метод operator>> , стрим активирует это устройство ввода. Дальше, работает уже само устройство ввода. Пользователь нажимает на клавиши до тех пор, пока не нажмёт enter. После чего, устройство ввода "считает", что данные введены, и отдаёт эти данные стриму. А стрим соответственно выдаёт эти данные вызывающей стороне. Вопрос такой: каким образом istream активизирует это реальное устройство ввода? Каким образом он посылает сигнал реальному устройству ввода о том, что пользователь хочет вводить данные с клавиатуры? Я пытался смотреть библиотечные файлы, но видимо мне не хватает знаний, что бы хоть что-то понять о внутреннем устройстве istream (там вообще тихий ужас из define, typedef, и наследования) Мне нужно понять, каким образом cin активирует устройство ввода. |
31.12.2011, 21:42 | #2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
в студии вызов std::cin.get ведет к streambuf.
кстати, кажется я знаю как вам решить проблему, напишите новый класс от std::streambuf, и потом просто присвоейте его std::cin.rdbuf(newbuf) http://cplusplus.com/reference/iostream/streambuf/ Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
31.12.2011, 21:42 | #3 |
Форумчанин
Регистрация: 29.09.2010
Сообщений: 636
|
Когда читал, у Страуструпа сказано только что там внутри много ассемблерных инструкций...
(как сам вв/в устроен) |
31.12.2011, 21:44 | #4 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
И я не вижу, где именно находится тот код, который активирует устройство ввода |
|
31.12.2011, 21:50 | #5 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
по ссылке есть интерфейс, то есть список функции которые вы должны реализовать. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
31.12.2011, 22:04 | #6 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
Я пытаюсь понять, как образом происходит активация стандартного устройства ввода. И каким образом достигается эффект "эхо-отражения" в этом устройстве. Я перенаправил stdin на моё собственное устройство ввода. Но откуда моё устройство узнает, что там, в другом потоке, cin присосался к трубе, и хочет получить данные? Откуда моё собственное устройство ввода узнает, что нужно писать в трубу, и при этом делать эхо-отражение? Мне нужно понять, как активируется стандартное устройство ввода, и научить своё собственное активироваться таким же образом. Тогда я смогу просто перенаправить stdin на своё собственное устройство, ничего не трогая в самом istream /зы Если бы речь шла только о приплюснутых стримах - не было б беды. Но речь идёт о сишных потоках тоже. Таким образом, мучать и коверкать приплюснутые стримы не вариант. Задача - перенаправление всех стандартных потоков, на свои собственные устройства ввода-вывода. Вывод я сделал. С вводом проблема вышла - не понятно как и что должно активизировать устройство ввода. В настоящий момент дизайн "как это работает" выглядит вот так: Код:
Последний раз редактировалось _Bers; 31.12.2011 в 22:26. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
E2015 Ambiguity between 'std::log(double)' and 'std::log(long double)' | Namolem | Помощь студентам | 3 | 02.04.2011 20:22 |
Внутренняя почтовый ящик | Andruhin | PHP | 60 | 07.02.2011 14:03 |
Внутренняя ошибка | makarov.y | Общие вопросы Delphi | 3 | 16.12.2010 20:32 |
Delphi: TWebBrowser + внутренняя перелинковка | antivir | Помощь студентам | 1 | 16.11.2010 22:01 |
ошибка: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char> | Critter | Общие вопросы C/C++ | 5 | 08.08.2010 23:38 |