Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU
(Тестовый режим)

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 31
от 03.02.2005, 19:20

Администратор:Калашников О.А. (adm@rusfaq.ru)
В номере:Вопросов: 1, Ответов: 4


Вопрос № 16410
Здравствуйте!
Есть программа:
1. #include <iostream>
2. int main()
3. {
4. char ch;
5. while ((ch=std::cin.get())!=EOF)
6. {
7. std::cout<<"ch: "<<ch<<std::endl;
8. }
9. /*ch=std::cin.get();
10. std::cout<<"ch= "<<ch;*/
11. std::cout<<" DONE!!! ";
12. return 0;
13.}
Мне не понятно как работает CIN в строке 5. Т.е. что происходит?
Сначала происходит ввод всего что ты хочешь ввести, т.е. работает сам CIN,
а потом уже в дело вступает GET() и посимвольно получает данные из буфера?
Объясните, пожалуйста. Я понимаю что этот метод GET() без параметров используется редко, но мне просто нужно понять как работают потоки, и в частности поток ввода.
И еще. Что делает метод PUTBACK( )?
Спасибо.
Отправлен: 29.01.2005, 15:33
Вопрос задал: Бейзель Александр Юрьевич (статус: Читатель)
Всего ответов отправлено: 4

Отвечает: _vt
Здравствуйте, Бейзель Александр Юрьевич!
1) get() получает символ с std::cin и если этот символ не EOF, то выполняется условие цикла - вывод на std::cout строки вида
ch: %c
где %с - символ, который был получен с std::cin.
2) putback() возвращает символ обратно в очередь, например, в стандартном случае - в буфер клавиатуры.

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

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

* EMan 2 beta: back in Black :)
Ответ отправил: _vt (статус: Академик)
Отправлен: 30.01.2005, 21:38

Отвечает: DiGiT
Здравствуйте, Бейзель Александр Юрьевич!
Дело в том что std::cin это поток(stream), который стандартный ввод логические представляет в виде потока, и реализует методы для работы со стандартным вводом. Функция get берет один символ с этого потока. Вся функциональность реализована в классе этого самого потока.
Ответ отправил: DiGiT (статус: 5-ый класс)
Отправлен: 31.01.2005, 04:10

Отвечает: vitya
Здравствуйте, Бейзель Александр Юрьевич!
1. EOF имеет тип int - соответственно нужно так ее и объявлять.
2. данная перегрузка get дает самый первый символ в буфере. cin начинает давать символы, после того, как нажат return
3. putback кладет символ обратно в поток.
Ответ отправил: vitya (статус: Профессор)
Отправлен: 31.01.2005, 12:27

Отвечает: Tigran K. Kalaidjian
Здравствуйте, Бейзель Александр Юрьевич!
Да. Происходит запись в буфер ds:dx с помощью функции 3Fh прерывания int21h(если Вы пишете под ДОС), а затем его обработка. (надо, правдо учесть, что, если вы напишете вместо этого cin >> ch, то процедура будет другой, хотя всё равно вызывается функция 3Fh) Если интересно, попробуйте отладить Вашу программу(хотя бы в TD) - там всё хорошо видно. Если интересно, я могу прислать дизассемблированную версию Вашей программы с комментариями - куда уж глубже сможете узнать как всё это работает =) - пишите на kalaidjian@pochtamt.ru
Функция putback() возвращает последний считанный из потока символ обратно в поток.
INT 21 - DOS 2+ - "READ" - READ FROM FILE OR DEVICE
AH = 3Fh
BX = file handle
CX = number of bytes to read
DS:DX -> buffer for data
Return: CF clear if successful
AX = number of bytes actually read (0 if at EOF before call)
CF set on error
AX = error code (05h,06h) (see #01680 at AH=59h/BX=0000h)
Notes: data is read beginning at current file position, and the file position
is updated after a successful read
the returned AX may be smaller than the request in CX if a partial
read occurred
if reading from CON, read stops at first CR
under the FlashTek X-32 DOS extender, the pointer is in DS:EDX
BUG: Novell NETX.EXE v3.26 and 3.31 do not set CF if the read fails due to
a record lock (see AH=5Ch), though it does return AX=0005h; this
has been documented by Novell
SeeAlso: AH=27h,AH=40h,AH=93h,INT 2F/AX=1108h,INT 2F/AX=1229h
Ответ отправил: Tigran K. Kalaidjian (статус: Профессионал)
Отправлен: 01.02.2005, 11:24


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, Россия, Москва. Идея, дизайн, программирование: Калашников О.А.


http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.cplus
Отписаться

В избранное