Здравствуйте!
Есть программа:
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