Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.12.2011, 21:26   #1
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию Внутренняя реализация std::cin

Мне нужно понять, каким образом cin активирует устройство ввода.

Скажу сразу, прежде чем создать эту тему, я очень много гуглил, прочел тонну литературы, пытался различными способами решить проблему самостоятельно. Но пока безрезультатно.

Что бы доступно объяснить суть вопроса, лучше сразу покажу на примере. Допустим, имеется вот такой код:

Код:
int main()
{
   //здесь куча всяких всячин

  std::cin >> data; //здесь мы просим пользователя ввести данные с клавиатуры

   //здесь куча всяких всячин

}
Все ниже написанное на самом деле является не более, чем моими домыслами.

Суть вопроса заключается в следующем: istream это просто механизм, который осуществляет взаимодействие между реальным устройством ввода, и целевой программой.

cin внутри себя каким то образом "настроен" на устройство ввода. И когда запускается метод operator>> , стрим активирует это устройство ввода.

Дальше, работает уже само устройство ввода.
Пользователь нажимает на клавиши до тех пор, пока не нажмёт enter.
После чего, устройство ввода "считает", что данные введены, и отдаёт эти данные стриму. А стрим соответственно выдаёт эти данные вызывающей стороне.


Вопрос такой: каким образом istream активизирует это реальное устройство ввода?

Каким образом он посылает сигнал реальному устройству ввода о том, что пользователь хочет вводить данные с клавиатуры?

Я пытался смотреть библиотечные файлы, но видимо мне не хватает знаний, что бы хоть что-то понять о внутреннем устройстве istream
(там вообще тихий ужас из define, typedef, и наследования)

Мне нужно понять, каким образом cin активирует устройство ввода.
_Bers вне форума Ответить с цитированием
Старый 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
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

Когда читал, у Страуструпа сказано только что там внутри много ассемблерных инструкций...

(как сам вв/в устроен)
onewho вне форума Ответить с цитированием
Старый 31.12.2011, 21:44   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
в студии вызов std::cin.get ведет к streambuf.
кстати, кажется я знаю как вам решить проблему, напишите новый класс от std::streambuf, и потом просто присвоейте его std::cin.rdbuf(newbuf)
http://cplusplus.com/reference/iostream/streambuf/
Вот я уже второй день пытаюсь понять, как устроен этот std::streambuf

И я не вижу, где именно находится тот код, который активирует устройство ввода
_Bers вне форума Ответить с цитированием
Старый 31.12.2011, 21:50   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Вот я уже второй день пытаюсь понять, как устроен этот std::streambuf
а зачем вам? вы же вроде умеете считывать с консоли
по ссылке есть интерфейс, то есть список функции которые вы должны реализовать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 31.12.2011, 22:04   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а зачем вам? вы же вроде умеете считывать с консоли
по ссылке есть интерфейс, то есть список функции которые вы должны реализовать.
Я пытаюсь добраться до стандартного устройства ввода, с которым работает istream.
Я пытаюсь понять, как образом происходит активация стандартного устройства ввода.
И каким образом достигается эффект "эхо-отражения" в этом устройстве.

Я перенаправил stdin на моё собственное устройство ввода.
Но откуда моё устройство узнает, что там, в другом потоке, cin присосался к трубе, и хочет получить данные?

Откуда моё собственное устройство ввода узнает, что нужно писать в трубу, и при этом делать эхо-отражение?

Мне нужно понять, как активируется стандартное устройство ввода, и научить своё собственное активироваться таким же образом.

Тогда я смогу просто перенаправить stdin на своё собственное устройство, ничего не трогая в самом istream

/зы Если бы речь шла только о приплюснутых стримах - не было б беды. Но речь идёт о сишных потоках тоже.
Таким образом, мучать и коверкать приплюснутые стримы не вариант.
Задача - перенаправление всех стандартных потоков, на свои собственные устройства ввода-вывода.
Вывод я сделал. С вводом проблема вышла - не понятно как и что должно активизировать устройство ввода.


В настоящий момент дизайн "как это работает" выглядит вот так:

Код:
   CDevOut outDev;                       //устройство вывода
    
    TWinKeyborad<CDevOut> inDev(&outDev); //устройство ввода, знает о существовании устройства вывода,
                                          //ибо нужно для эхо-отражений

    //Перехватчик перенаправит стандартные потоки ввода-вывода на мои устройства
    TInterceptor<TWinKeyborad<CDevOut>, CDevOut> myTest(inDev, outDev);

    //теперь данные от cout или printf будут улетать к outDev
    //а данные для cin или scanf будут добываться из inDev

    //но откуда устройство ввода inDev узнает, что cin захотел получить данные?

Последний раз редактировалось _Bers; 31.12.2011 в 22:26.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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