246071-Либерти-Освой-самостоятельно-С-за-21-день (852741), страница 81
Текст из файла (страница 81)
Они используются в тех случаях, когда необходим более совершенныйконтрольнадвводомданных.ВвододногосимволаВариант operator>>, принимающий ссылку на символ, может использоваться длясчитыванияодногосимволасостандартногоустройстваввода.Дляэтогоиспользуетсяфункциячленget().Приэтомможноприменятьget()безпараметровилииспользоватьвариантэтойжефункции,принимающейвкачествепараметрассылкунасимвол.Использованиефункцииgef()безпараметровСначаларассмотримиспользованиефункцииget()безпараметров.ВэтомслучаефункциявозвращаетзначениенайденногосимволаилиEOF(endoffile—конецфайла)придостиженииконца файла. Функция get () без параметров используется редко.
Так, cin.get() нельзяиспользоватьдляпоследовательнойинициализациирядапеременных,посколькувозвращаемоефункциейзначениенеявляетсяобъектомiostream.Именнопоэтомуследующаязаписьработатьнебудет:cin.get()>>myVarOne>>myVarTwo//ошибкаЗапись cin.get() >> myVarOne возвращает значение типа int, а не объект iostream. Примериспользованияфункцииget()безпараметровпоказанвлистинге16.4.Листинг16.4.Использованиефункцииget()Везпараметров1://Листинг16.4.Использованиеget()безпараметров2:#include<iostream.h>3:4:intmain()5:{6:charch;7:while((ch=cin.get())!=EOF)8:{9:cout<<"ch:"<<ch<<endl;10:}11:cout<<"\nDone!\n";12:return0;13:}Примечание:Для выхода из этой программы придется ввести символ конца файла склавиатуры.
С этой целью в операционной системе DOS используется комбинация клавиш<Ctrl+Z>,авUNIX—<Ctrl+D>.Результат:HellochHchech1ch1chоchWorldchWchоchrch1chdch(ctrl-z)Done!Анализ:Встроке6объявляетсялокальнаясимвольнаяпеременная.Вциклеwhileсимвол,полученный от cin.get(), присваивается ch, и если возвращенный символ не EOF, то онвыводитсянапечать.ЦиклзавершаетсявводомEOF,комбинациейклавиш<Ctrl+Z>вDOSили<Ctrl+D>вUNIX.Следуетотметить,чтоневовсехверсияхбиблиотекиistreamподдерживаетсяфункциячленget(),хотясейчасонаявляетсячастьюстандартаANSI/ISO.Использованиефункцииget()спараметромПриустановкевфункцииget()параметра,указывающегонасимвольнуюпеременную,этойпеременной присваивается очередной символ потока ввода.
При этом возвращается объектiostream,чтопозволяетвводитьпоследовательныйрядзначений,какпоказановлистинге16.5.Листинг16.5.Использованиефункцииget()спараметрами1://Листинг16.5.Использованиеget()спараметрами2:#include<iostream.h>3:4:intmain()5:{6:charа,b,с;7:8:cout<<"Enterthreeletters:";9:10:cin.get(a).get(b).get(c);11:12:cout<<"а:"<<а<<"\nb:"<<b<<"\nc:"<<с<<endl;13:return0;14:}Результат:Enterthreeletters:oneа:оb:nс:eАнализ: В строке 6 объявляются символьные переменные а, b и с.
В строке 10 триждыпоследовательно вызывается функция cin.get(). Сначала вызывается cin.get(a), в результатепервый символ буфера ввода заносится в а и возвращается объект cin, после чего происходитвызовcin.get(b),присваивающийочереднойсимволбуферапеременнойb.Аналогичнымобразомвызываетсяфункцияcin.get(c),присваивающаяследующийсимволпеременнойс.Посколькуcin.get()возвращаетcin,можнобылозаписатьэтоследующимобразом:cin.get(a)>>b;Вэтомслучаеcin.get(a)возвратитcin,поэтомуследующеевыражениебудетиметьвид:cin>>b;.Рекомендуется:Используйте оператор ввода >>, когда необходимо вводить значения,разделенные пробелами в строке. Используйте функцию get() с символьным параметром, еслинужнопоследовательновводитьвсесимволыстроки,включаяпробелы.ВводстроксостандартногоустройствавводаДля заполнения массива символов можно использовать как оператор ввода (>>), так иметодыget()иgetline().Еще один вариант перегруженной функции get() принимает три параметра.
Первыйпараметр—этоуказательнамассивсимволов,второйуказываетмаксимальноечислосимволовв строке с учетом концевого нулевого символа, добавляемого автоматически, и третий задаетразделительстрок.Если для второго параметра установлено значение 20, функция get() введет 19 символов иоборвет ввод строки, на которую указывал первый параметр, после чего добавит концевойнулевойсимвол.Третийпараметрпоумолчаниюустанавливаетсякаксимволразрывастроки(\n). Если этот символ повстречается раньше, чем будет введен последний допустимый символстроки,функциявставитвэтомместеконцевойнулевойсимвол,носимволразрывастрокиприэтомостанетсявбуфереибудетсчитаночереднойфункциейввода.Реализацияэтогометодавводапоказанавлистинге16.6.Листинг16.6.Использованиефункцииget()длязаполнениямассивасимволов1://Листинг16.6.Использованиеget()cмассивомсимволов2:#include<iostream.h>3:4:intmain()5:{6:charstringOne[256];7:charstringTwo[256];8:9:cout<<"Enterstringone:";10:cin.get(stringOne,256);11:cout<<"stringOne:"<<stringOne<<endl;12:13:cout<<"Enterstringtwo:";14:cin>>stringTwo;15:cout<<"StringTwo:"<<stringTwo<<endl;16:return0;17:}Результат:Enterstringone:NowisthetimestringOne:NowisthetimeEnterstringtwo:ForallgoodStringTwo:ForАнализ: В строках 6 и 7 создаются два массива символов.
Строка 9 предлагаетпользователюввестистроку,послечеговстроке10вызываетсяфункцияcin.get() с тремя параметрами. Первый параметр ссылается на заполняемый массивсимволов, второй задает максимально возможное количество символов в строке с учетомнулевогоконцевогосимвола('\0').Третийпараметрнеустановлен,ииспользуетсязаданныйпоумолчаниюсимволразрывастроки.Пользователь вводит строку Now is the time. Вся строка вместе с концевым нулевымсимволомпомещаетсявмассивstringOne.Вторую строку пользователю предлагается ввести в строке 13, однако в этом случае ужеиспользуется оператор ввода. Поскольку он считывает строку до первого пробела, во второмслучаевбуферзаноситсястрокаВсе,что,конечноже,неправильно.Одинизспособоврешенияэтойпроблемызаключаетсявиспользованиифункцииgetline(),какпоказановлистинге16.7.Листинг1B.7.Использованиефункцииgetline()1://Листинг16.7.Использованиеgetline()2:#include<iostream.h>3:4:intmain()5:{6:charstringOne[256];7:charstringTwo[256];8:charstringThree[256];9:10:cout<<"Enterstringone:";11:cin.getline(stringOne,256);12:cout<<"stringOne:"<<stringOne<<endl;13:14:cout<<"Enterstringtwo:";15:cin>>stringTwo;16:cout<<"stringTwo:"<<stringTwo<<endl;17:18:cout<<"Enterstringthree:";19:cin.getline(stringThree,256);20:cout<<"stringThree:"<<stringThree<<endl;21:return0;22:}Результат:Enterstringone:onetwothreestringOne:onetwothreeEnterstringtwo:fourfivesixstringTwo:fourEnterstringthree:stringThree:fivesixАнализ: Этот пример требует детального исследования, поскольку возможны некоторыесюрпризы.В строках 6—8 объявляются массивы символов.
В строке 10 пользователю предлагаетсяввести строку текста, которая считывается функцией getline(). Аналогично функции get(),параметры getline() устанавливают буфер ввода и максимальное число символов. Однако, вотличиеотget(),функцияgetline()считываетиудаляетизбуферасимволразрывастроки.Каквыпомните,функцияget()воспринимаетсимволразрывастроккакразделительиоставляетеговбуфереввода.В строке 14 пользователю вновь предлагается ввести строку, которая теперь ужесчитываетсяоператоромввода.Внашемпримеревводитсястрокаfourfivesix,послечегопервоеслово four присваивается переменной stringTwo. После отображения предложения Enter stringthree: снова вызывается функция getline().
Так как часть строки five six все еще находится вбуфереввода,онасразусчитываетсядосимволановойстроки.Функцияgetline()завершаетсвоюработу,истрокой20выводитсязначениепеременнойstringThree.Врезультатетретьястроканевводитсявпрограмму,посколькуфункцияgetline()возвращаетчасть строки, оставшуюся в буфере после операции ввода в строке 15, так как оператор >>считываетстрокутолькодопервогопробелаивставляетнайденноеслововмассивсимволов.Каквыпомните,можноиспользоватьнескольковариантовперегруженнойфунк-ции-членаget(). В первом варианте она не принимает никаких параметров и возвращает значениеполученного символа.
Во втором принимается ссылка на односимвольную переменную ивозвращается объект istream. В третьей, последней версии в функцию get() устанавливаютсямассив символов, количество считываемых символов и символ разделения (которым поумолчанию является разрыв строки). Эта версия функции get () возвращает символы в массивлибодотехпор,поканебудетвведеномаксимальновозможноеколичествосимволов,либодопервого символа разрыва строки.
Если функция get() встречает символ разрыва строки, вводпрерывается,асимволразрывастрокиостаетсявбуфереввода.Функция-член getline() также принимает три параметра: буфер ввода, число символов встрокесучетомконцевогонулевогосимволаисимволразделения.Функцияgetline()действуетаналогично описанной выше функции get(), но отличается от последней только тем, что неоставляетвбуфересимволразрывастроки.Использованиефункцииcin.ignore() В некоторых случаях возникает необходимость пропустить часть символов строки отначала до достижения конца строки (EOL) или конца файла (EOF).
Именно этому и отвечаетфункция ignore(). Она принимает два параметра: число пропускаемых символов и символразделения. Например, вызов функции ignore(80, '\n') приведет к пропуску 80 символов, еслиранее не будет найден символ начала новой строки. Последний затем будет удален из буфера,послечегофункцияignore()завершитсвоюработу.Использованиефункцииignore()показановлистинге16.8.Листинг16.8.Использованиефункцииignore()1://Листинг16.8.Использованиеignore()2:#include<iostream.h>3:4:intmain()5:{6:charstring0ne[255];7:charstringTwo[255];8:9:cout<<"Enterstringone:";10:cin.get(stringOne,255);11:cout<<"Stringone:"<<stringOne<<endl;12:13:cout<<"Enterstringtwo:";14:cin.getline(stringTwo,255);15:cout<<"Stringtwo:"<<stringTwo<<endl;16:17:cout<<"\n\nNowtryagain...\n";18:19:cin.ignore(255,'\n');20:cout<<"Enterstringtwo:";21:cin.getline(stringTwo,255);22:23:cout<<"StringTwo:"<<stringTwo<<endl;24:25:cout<<"Enterstringone:";26:cin.get(stringOne,255);27:cout<<"Stringone:"<<stringOne<<endl;28:return0;29:}Результат:Enterstringone:onceuponаtimeStringone:onceuponаtimeEnterstringtwo:Stringtwo:Nowtryagain...Enterstringone:onceuponatimeStringone:onceuponatimeEnterstringtwo:therewasaStringTwo:therewasaАнализ: В строках 6 и 7 создаются два массива символов.