Водич за Ц ++: Сазнајте више о уносу и излазу

01

од 08

Нови начин за излаз

Програмски код
траффиц_анализер / Гетти слике

Ц ++ задржава врло високу повратну компатибилност са Ц, тако да могу да се укључе како би вам приступили принтф () функција за излаз. Међутим, И / О који пружа Ц ++ је значајно снажнији и још важније, сигурни тип. И даље можете да користите сцанф () за унос, али врсте безбедности које пружа Ц ++ значи да ће ваше апликације бити робусније ако користите Ц ++.

У претходној лекцији ово се дотакло примером који је користио цоут. Овде ћемо ући у мало већу дубину, почевши од излаза прво јер он изгледа више користи него унос.

Иостреам класа омогућава приступ објектима и методама који су вам потребни и за излаз и за улаз. Размислите о / о у смислу токова бајтова - било да идете од ваше апликације до датотеке, екрана или штампача - то је излаз, или са тастатуре - то је улаз.

Излаз са Цоут-ом

Ако знате Ц, то можда знате << користи се за померање делова улево. Нпр. 3 << 3 је 24. Нпр. Помак у лијево удвостручује вриједност, тако да 3 смјене у лијево множе с 8.

instagram viewer

На Ц ++, << је био преоптерећен у остреам класи тако да инт, пловак, и врсте жице (и њихове варијанте - нпр парови) сви су подржани. Овако излазите на текст тако што повезујете више ставки између <<.>


цоут << "Неки текст" << интвалуе << флоатдоубле << ендл; 

Ова осебујна синтакса могућа је јер сваки од << је заправо позив функције који враћа а референца на остреам објекта. Дакле, линија попут горње је заправо таква


цоут. << ("неки текст"). цоут. << (интвалуе) .цоут. << (флоатдоубле) .цоут. << (ендл); 

Ц функцијапринтф успео је да форматира излаз користећи Спецификаторе формата, као што су% д. У Ц ++ цоут такође може форматирати излаз, али користи другачији начин рада.

02

од 08

Употреба Цоут-а за форматирање излаза

Објектни цоут је члан иостреам библиотека. Не заборавите да ово мора бити укључено са


#инцлуде 

Ова библиотека иостреам је изведено из остреам (за излаз) и истреам за улаз.

Форматирање Излаз текста се врши уметањем манипулатора у излазни ток.

Шта је манипулатор?

То је функција која може изменити карактеристике излазног (и улазног) тока. На претходној страници смо то видели << била је преоптерећена функција која је враћала референцу на позивни објект, нпр. цоут за излаз или цин за улаз. Сви манипулатори то раде тако да их можете укључити у излаз << или улаза >>. Погледаћемо улаз и >> касније у овој лекцији.


цоунт << ендл; 

ендл је манипулатор који завршава линију (и започиње нову). То је функција која се такође може назвати на овај начин.


ендл (цоут); 

Иако у пракси то не бисте урадили. Користите га овако.


цоут << "Неки текст" << ендл << ендл; // Две празне линије 

Датотеке су само токови

Нешто за имати на уму да се данас развија много развоја ГУИ апликације, зашто би вам биле потребне текстуалне И / О функције? Није ли то само за конзола апликације? Па, вероватно ћете направити фајлско И / О датотеке и можете их користити и тамо, али и оно што се излази на екран обично треба и форматирање. Струје су врло флексибилан начин руковања улазом и излазом и могу радити са њима

  • Текст И / О. Као и код конзола.
  • Гудачи. Погодно за форматирање.
  • Датотека И / О.

Опет Манипулатори

Иако смо користили остреам класа, то је изведена класа од иос класе која потиче из иос_басе. Ова класа предака дефинише јавност функције који су манипулатори.

03

од 08

Списак Цоут Манипулатора

Манипулатори се могу дефинисати у улазним или излазним токовима. То су објекти који враћају референцу на објект и смештају се између парова <<. Већина манипулатора је декларисана, али ендл, Крајеви и испирати потјечу од . Неколико манипулатора узима један параметар и они долазе .

Ево детаљније листе.

Фром

  • ендл - Завршава линију и позива флусх.
  • крајеви - Уметања '\ 0' ( НУЛА) у ток.
  • испирање - Присилите да се тампон одмах избаци.

Фром . Већина је пријављена у предак од . Груписао сам их по функцијама, а не абецедно.

  • боолалпха - Уметање или екстрахирање боол објеката као "труе" или "фалсе".
  • нобоолалпха - Уметање или вађење боол објеката као нумеричких вредности.
  • фиксно - Уметните вредности с помичним зарезом у фиксном формату.
  • научно - Убаците вредности са зарезом у тачку у научни формат.
  • интерни - Интерно оправдати.
  • лево - оправдано лево.
  • тачно - оправдање исправно.
  • дец - Уметање или екстрахирање целих вредности у децималном формату.
  • хек - Уметање или екстрахирање целих вредности у хексадецималном (основном 16) формату.
  • оцт - Уметните или извуците вредности у окталном (основном 8) формату.
  • носховбасе - Не префиксајте вредност са њеном основом.
  • сховбасе - вредност префикса са његовом базом.
  • носховпоинт - Ако није потребно, не приказујте децималну тачку.
  • сховпоинт - Уметање вредности с помичном зарезом увек приказује децималну тачку.
  • носховпос - Не убацујте знак плус (+) ако је број> = 0.
  • сховпос - Убаците знак плус (+) ако је број> = 0.
  • носкипвс - Не прескачите почетни бели простор приликом вађења.
  • скипвс - Прескочите почетни бели простор приликом вађења.
  • ноупперцасе - Немојте заменити мала слова великим словима.
  • Велика слова - Замените мала слова великим еквивалентима великих слова.
  • унитбуф - Исперите тампон након уметања.
  • ноунитбуф - Не испирајте тампон након сваког уметања.

04

од 08

Примери помоћу Цоут-а

// ек2_2цпп. #инцлуде "стдафк.х" #инцлудекористећи намеспаце стд; инт маин (инт аргц, цхар * аргв []) { цоут.видтх (10); цоут << ригхт << "Тест" << ендл; цоут << лефт << "Тест 2" << ендл; цоут << Интернал << "Тест 3" << ендл; цоут << ендл; тачност прецизности (2); цоут << 45.678 << ендл; цоут << велика слова << "Давид" << ендл; тачност прецизности (8); цоут << научни << ендл; цоут << 450678762345.123 << ендл; цоут << фиксно << ендл; цоут << 450678762345.123 << ендл; цоут << сховбасе << ендл; цоут << сховпос << << ендл; цоут << хек << ендл; цоут << 1234 << ендл; цоут << окт << ендл; цоут << 1234 << ендл; цоут << дец << ендл; цоут << 1234 << ендл; цоут << носховбасе << ендл; цоут << носховпос << ендл; цоут.унсетф (иос:: велика слова); цоут << хек << ендл; цоут << 1234 << ендл; цоут << окт << ендл; цоут << 1234 << ендл; цоут << дец << ендл; цоут << 1234 << ендл; ретурн 0; }

Излаз из овога је испод, с једним или два додатна размака линија ради јасноће.

 Тест. 2. тест Тест 3 46. Давид. 4.50678762Е + 011. 450678762345.12299000. 0Кс4Д2. 02322. +1234. 4д2. 2322. 1234. 

Белешка: Упркос великим словима, Давид је штампан као Давид, а не ДАВИД. То је зато што велика слова утичу само на генерисани излаз - нпр. бројеви исписани у хексадецимални. Дакле, шестерокутни излаз 4д2 је 4Д2 када се користи велика слова.

Такође, већина ових манипулатора заправо поставља мало у заставу и могуће је директно поставити ово

 цоут.сетф () 

и то очистите

 цоут.унсетф () 

05

од 08

Употреба Сетф и Унсетф за манипулисање И / О форматирањем

Функција сетф има две преоптерећен верзије приказане доле. Док унсетф само брише наведене битове.

 сетф (вредности заставе); сетф (вредности заставе, маске); унсетф (флагвалуес); 

Променљиве заставе су изведене са ОРинг заједно све битове које желите са |. Па ако желите научни, велика слова и боолалпха онда искористите ово. Само су делови прослеђени као параметар су постављени. Остали битови остају непромењени.

 цоут.сетф (иос_басе:: научно | иос_басе: велика слова | иос_басе:: боолалпха); цоут << хек << ендл; цоут << 1234 << ендл; цоут << дец << ендл; цоут << 123400003744.98765 << ендл; вредност боол = тачно; цоут << вредност << ендл; цоут.унсетф (иос_басе:: боолалпха); цоут << вредност << ендл; 

Производи

 4Д2. 1.234000Е + 011. истина. 1. 

Маскинг Битс

Два параметар верзија сета користи маску. Ако је бит постављен у првом и другом параметру, тада се поставља. Ако је бит само у другом параметру, онда се брише. Вредности Подесиво поље, основно поље и флоатфиелд (наведене доле) су композитне заставе, то јест неколико застава Или би заједно. За основно поље са вредностима 0к0е00 исто је као дец | окт | хек. Тако

 сетф (иос_басе:: хек, иос_басефиелд); 

брише све три заставице и затим поставља хек. Слично томе прилагоди поље је лефт | тачно | интерни и флоатфиелд је научни | фиксно.

Списак битова

Ова листа енума преузета је са Мицрософт Висуал Ц ++ 6.0. Стварне вредности које се користе су произвољне - други компајлер може користити различите вредности.

 скипвс = 0к0001. унитбуф = 0к0002. велика слова = 0к0004. сховбасе = 0к0008. сховпоинт = 0к0010. сховпос = 0к0020. лево = 0к0040. ригхт = 0к0080. интерни = 0к0100. дец = 0к0200. окт = 0к0400. хек = 0к0800. научно = 0к1000. фиксно = 0к2000. боолалпха = 0к4000. прилагоди поље = 0к01ц0. основно поље = 0к0е00, флоатфиелд = 0к3000. _Фмтмаск = 0к7ффф, _Фмтзеро = 0. 

06

од 08

О Клору и Церру

Као цоут, зачепити и церр су унапред дефинисани објекти дефинисани у остреаму. Иостреам класа наслеђује од оба остреам и истреам па је зато цоут примери могу да се користе иостреам.

Буферирано и неоптерећено

  • Буферирано - сав излаз се привремено чува у а тампон а затим је у једном потезу бачен на екран. Пуњење и зачепљење су пуферирани.
  • Небуферирано - сав излаз одмах иде на излазни уређај. Пример небуферираног објекта је церр.

Примјер у наставку показује да се церр користи на исти начин као и цоут.


#инцлуде користећи намеспаце стд; инт _тмаин (инт аргц, _ТЦХАР * аргв []) {церр.видтх (15); церр.ригхт; церр << "Грешка" << ендл; ретурн 0; }

Главни проблем са пуферирањем је ако програм руши, тада се садржај међуспремника губи и теже је схватити зашто се срушио. Небуферирани излаз је непосредан тако да би пошприцавање неколико редака попут ове могло бити корисно.

 церр << "Унос опасне функције заппит" << ендл; 

Проблем са евидентирањем

Изградња дневника програмских догађаја може бити користан начин за проналажење тешких грешака - типа који се јављају само понекад и касније. Ако је тај догађај пад сустава, имате проблем - да ли након сваког позива пребаците записник на диск како бисте могли да видите догађаје све до рушења или га држите у међуспремнику и периодично испирајте тампон и надам се да нећете изгубити превише током пада. јавља?

07

од 08

Коришћење функције Цин за унос: форматирани унос

Постоје две врсте уноса.

  • Форматирано Читање уноса као бројева или одређене врсте.
  • Неформатизовано. Читање бајтова или жице. То даје много већу контролу над улазним током.

Ево једноставног примера форматираног уноса.

 // екцин_1.цпп: Дефинише улазну тачку за апликацију за конзолу. #инцлуде "стдафк.х" // Само за Мицрософт. #инцлуде користећи намеспаце стд; инт маин (инт аргц, цхар * аргв []) { инт а = 0; флоат б = 0,0; инт ц = 0; цоут << "Унесите инт, флоат и инт раздвојене размацима" <> а >> б >> ц; цоут << "Унели сте" << а << "" << б << "" << ц << ендл; ретурн 0; }

Ово користи цин за читање три броја (инт, пловак, инт) одвојени размацима. Након уписивања броја морате притиснути ентер.

3 7.2 3 ће се приказати "Унели сте 3 7.2 3".

Форматирани унос има ограничења!

Ако унесете 3,76 5 8, добићете „Унели сте 3 0,76 5“, све остале вредности на тој линији се губе. То се понаша коректно, као. није део инта и тако означава почетак пловка.

Еррор Траппинг

Цин објект поставља битак неуспјеха ако улаз није успјешно претворен. Овај део је део иос и може се читати употребом фаил () функционишу на оба цин и цоут овако.

 ако (цин.фаил ()) // уради нешто. 

Не изненађује, цоут.фаил () се ретко поставља, барем на излазу са екрана. У каснијој лекцији о датотеци И / О видећемо како цоут.фаил () може постати истина. Постоји и Добро() функција за цин, цоут итд.