Урок C ++: Научете за вход и изход

01

от 08

Нов път към резултатите

Програмен код
traffic_analyzer / Гети изображения

C ++ запазва много висока обратна съвместимост с C, така че може да бъде включен, за да ви даде достъп до ФОРМАТ () функция за изход. Въпреки това, I / O, предоставен от C ++, е значително по-мощен и по-важно тип безопасност. Все още можете да използвате scanf () за въвеждане, но функциите за безопасност на типа, които предоставя C ++, означава, че вашите приложения ще бъдат по-стабилни, ако използвате C ++.

В предишния урок това беше засегнато с пример, използващ cout. Тук ще влезем в малко по-голяма дълбочина, като се започне първо с продукцията, тъй като има тенденция да се използва повече от въвеждането.

Класът iostream осигурява достъп до обектите и методите, от които се нуждаете както за изход, така и за вход. Помислете за i / o по отношение на потоци от байтове - или от приложението ви към файл, екран или принтер - това е изход, или от клавиатурата - това е вход.

Изход с Cout

Ако знаете C, може да знаете това << се използва за изместване на битове вляво. Например 3 << 3 е 24. Например лявата смяна удвоява стойността, така че 3 леви смени го умножават по 8.

instagram viewer

В C ++, << е била претоварен в ostream класа, така че инт, поплавък, и струнни типове (и техните варианти - напр двойки) всички се поддържат. Ето как правите извеждане на текст, като обединявате няколко елемента между <<.>


cout << "Some Text" << intvalue << floatdouble << endl; 

Този особен синтаксис е възможен, защото всеки от << всъщност е повикване на функция, което връща a препратка до поток обект. Така че линия като горната всъщност е такава


cout. << ("някакъв текст"). cout. << (intvalue) .cout. << (floatdouble) .cout. << (endl); 

С функцияФОРМАТ беше в състояние да форматира изхода с помощта на формат спецификатори, като% d. В C ++ cout също може да форматира изход, но използва различен начин на правене.

02

от 08

Използване на Cout за форматиране на изхода

Обектът cout е член на iostream библиотека. Не забравяйте, че това трябва да бъде включено с a


#include 

Тази библиотека iostream произлиза от ostream (за изход) и istream за вход.

Форматирането на извеждане на текст се извършва чрез поставяне на манипулатори в изходния поток.

Какво е манипулатор?

Това е функция, която може да промени характеристиките на изходния (и входния) поток. На предишната страница видяхме това << беше претоварена функция, която връщаше препратка към извикващия обект, напр. cout за изход или cin за вход. Всички манипулатори правят това, за да можете да ги включите в изхода << или вход >>. Ще разгледаме входа и >> по-късно в този урок.


брой << endl; 

Endl е манипулатор, който завършва линията (и стартира нова). Това е функция, която също може да бъде извикана по този начин.


endl (cout); 

Въпреки че на практика не бихте направили това. Използвате го така.


cout << "Някои текстове" << endl << endl; // Два празни реда 

Файловете са просто потоци

Нещо, което трябва да се има предвид, че с много развитие в наши дни GUI приложения, защо ще ви трябва текстови входно / изходни функции? Това не е само за конзола приложения? Е, вероятно ще направите файл I / O и можете да ги използвате и там, но също така това, което се извежда на екрана, обикновено също се нуждае от форматиране. Потоците са много гъвкав начин за работа с вход и изход и могат да работят с тях

  • Текст I / O. Както в конзолните приложения.
  • Strings. Подходящ за форматиране.
  • Файл I / O.

Отново манипулатори

Въпреки че ние използваме ostream клас, това е а производен клас от IOS клас, който произлиза от ios_base. Този клас предци определя обществеността функции които са манипулатори.

03

от 08

Списък на манипулаторите на Cout

Манипулаторите могат да бъдат дефинирани във входни или изходни потоци. Това са обекти, които връщат препратка към обекта и се поставят между двойки <<. Повечето от манипулаторите са декларирани в, но Endl, краища и промиване идвам от . Няколко манипулатора вземат един параметър и тези идват .

Ето по-подробен списък.

от

  • endl - Завършва линията и се обажда флъш.
  • краища - Вмъкване '\ 0' ( НУЛА) в потока.
  • flush - Принудете буфера да се изведе незабавно.

от . Повечето са декларирани в прародител на . Групирах ги по функция, а не по азбучен ред.

  • boolalpha - Вмъкване или извличане на bool обекти като "true" или "false".
  • noboolalpha - Вмъкване или извличане на bool обекти като числови стойности.
  • фиксиран - Вмъкнете стойности с плаваща запетая във фиксиран формат.
  • научен - Вмъкнете стойности с плаваща запетая в научен формат.
  • вътрешен - Вътрешно-обосновка.
  • вляво - отляво-оправдайте.
  • вдясно - Право-обосновка.
  • dec - Вмъкване или извличане на цели числа в десетичен формат.
  • шестнадесетичен - Вмъкване или извличане на цели числа в шестнадесетичен (основен 16) формат.
  • oct - Вмъкване или извличане на стойности в осмален (основен 8) формат.
  • noshowbase - Не префиксирайте стойността с нейната основа.
  • showbase - Префиксна стойност с нейната основа.
  • noshowpoint - Не показвайте десетична запетая, ако не е необходимо.
  • showpoint - Винаги показвайте десетичната запетая, когато вмъквате стойности с плаваща запетая.
  • noshowpos - Не вмъквайте знак плюс (+), ако числото е = 0.
  • showpos - Поставете знак плюс (+), ако числото е = 0.
  • noskipws - Не пропускайте първоначалното бяло пространство при извличане.
  • skipws - Пропуснете първоначалното бяло пространство при извличане.
  • nouppercase - Не замествайте малки букви с големи еквиваленти.
  • малки букви - Заменете малки букви с големи еквиваленти.
  • unitbuf - Бутон за промиване след вмъкване.
  • nounitbuf - Не промивайте буфер след всяко вмъкване.

04

от 08

Примери, използващи Cout

// ex2_2cpp. #include "stdafx.h" #includeизползване на пространството на имената std; int main (int argc, char * argv []) { cout.width (10); cout << right << "Test" << endl; cout << left << "Test 2" << endl; cout << Internal << "Test 3" << endl; cout << endl; cout.прецизност (2); cout << 45.678 << endl; cout << главна буква << "David" << endl; cout.прецизност (8); cout << научен << endl; cout << 450678762345.123 << endl; cout << фиксиран << endl; cout << 450678762345.123 << endl; cout << showbase << endl; cout << showpos << endl; cout << hex << endl; cout << 1234 << endl; cout << oct << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; cout << noshowbase << endl; cout << noshowpos << endl; cout.unsetf (ios:: големи букви); cout << hex << endl; cout << 1234 << endl; cout << oct << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; връщане 0; }

Резултатът от това е по-долу, като за яснота се премахват едно или две допълнителни редови интервали.

 Тест. Тест 2. Тест 3. 46. Дейвид. 4.50678762E + 011. 450678762345.12299000. 0X4D2. 02322. +1234. 4d2. 2322. 1234. 

Забележка: Въпреки главните букви, Дейвид се отпечатва като Дейвид, а не като DAVID. Това е така, защото главни букви засягат само генерираните резултати - напр. номера, отпечатани в шестнадесетичен. Така че шестнадесетичният изход 4d2 е 4D2, когато главни букви работят.

Също така повечето от тези манипулатори всъщност задават малко флаг и е възможно директно да се зададе това

 cout.setf () 

и го изчисти с

 cout.unsetf () 

05

от 08

Използване на Setf и Unsetf за манипулиране на I / O форматиране

Функцията setf има две претоварен версии, показани по-долу. Докато unsetf просто изчиства посочените битове.

 setf (значения на знамето); setf (флагмани, маски); unsetf (значения на знамената); 

Променливите знамена се получават от О-пръстеновидни заедно всички битове, които искате с |. Така че, ако искате научна, главна и булалфа след това използвайте това. Само битовете преминаха като параметър са зададени. Останалите битове се оставят непроменени.

 cout.setf (ios_base:: научна | ios_base:: главна буква | ios_base:: boolalpha); cout << hex << endl; cout << 1234 << endl; cout << dec << endl; cout << 123400003744.98765 << endl; bool стойност = вярно; cout << стойност << endl; cout.unsetf (ios_base:: boolalpha); cout << стойност << endl; 

Произвежда

 4D2. 1.234000E + 011. вярно. 1. 

Маскиране на битове

Двете параметър версия на setf използва маска. Ако битът е зададен както в първия, така и във втория параметър, той се задава. Ако битът е само във втория параметър, той се изчиства. Стойностите коригиращо поле, базово поле и floatfield (изброени по-долу) са съставни знамена, тоест няколко знамена Or'd заедно. За basefield със стойностите 0x0e00 е същото като дек | окт | магия. Така

 setf (ios_base: hex, ios_basefield); 

изчиства и трите флага след това се задава магия. по същия начин adjustfield е вляво | дясно | вътрешен и floatfield е научен | фиксиран.

Списък на битове

Този списък с изброени данни е взет от Microsoft Visual C ++ 6.0. Реално използваните стойности са произволни - друг компилатор може да използва различни стойности.

 skipws = 0x0001. unitbuf = 0x0002. големи букви = 0x0004. showbase = 0x0008. showpoint = 0x0010. showpos = 0x0020. вляво = 0x0040. дясно = 0x0080. вътрешен = 0x0100. dec = 0x0200. окт = 0х0400. шестнадесетичен = 0x0800. научен = 0x1000. фиксиран = 0x2000. булалфа = 0x4000. коригиращо поле = 0x01c0. базово поле = 0x0e00, floatfield = 0x3000. _Fmtmask = 0x7fff, _Fmtzero = 0. 

06

от 08

За Clog и Cerr

като Cout, спъвам и cerr са предварително дефинирани обекти, дефинирани в ostream. Класът iostream наследява и от двете ostream и istream така че затова Cout примерите могат да се използват iostream.

Буферирани и небуферирани

  • Буфериран - целият изход временно се съхранява в a буфер и след това се хвърли на екрана с едно движение. И букетът и запушването са буферирани.
  • Небуфериран - целият изход отива незабавно към изходното устройство. Пример за небуфериран обект е cerr.

Примерът по-долу показва, че cerr се използва по същия начин като cout.


#include използване на пространството на имената std; int _tmain (int argc, _TCHAR * argv []) {cerr.width (15); cerr.right; cerr << "Грешка" << endl; връщане 0; }

Основният проблем с буферирането е, ако програма срива, след това съдържанието на буфера се губи и е по-трудно да се разбере защо се срива. Небуферният изход е незабавен, така че поръсването на няколко реда като този чрез кода може да е полезно.

 cerr << "Въвеждане на опасна функция zappit" << endl; 

Проблемът с регистрирането

Изграждането на дневник на програмните събития може да бъде полезен начин за откриване на трудни бъгове - типа, които се появяват само от време на време. Ако това събитие е срив, имате проблем - прехвърляте ли журнала на диска след всяко повикване, за да можете да виждате събития до срива или го съхранявайте в буфер и периодично промивайте буфера и се надявайте да не загубите прекалено много при срива се случва?

07

от 08

Използване на Cin за въвеждане: Форматиран вход

Има два типа въвеждане.

  • Форматиран. Четене на вход като числа или от определен тип.
  • Неформатиран. Четене на байтове или струни. Това дава много по-голям контрол върху входящия поток.

Ето един прост пример за форматиран вход.

 // excin_1.cpp: Определя входната точка за приложението за конзолата. #include "stdafx.h" // Само за Microsoft. #include използване на пространството на имената std; int main (int argc, char * argv []) { int a = 0; float b = 0,0; int c = 0; cout << "Моля, въведете int, float и int разделени с интервали" <> a >> b >> c; cout << "Въведете" << a << "" << b << "" << c << endl; връщане 0; }

Това използва cin, за да прочете три числа (инт, поплавък, int) разделени с интервали. Трябва да натиснете Enter, след като въведете номера.

3 7.2 3 ще изведе "Въведохте 3 7.2 3".

Форматираният вход има ограничения!

Ако въведете 3.76 5 8, получавате „Въвели сте 3 0.76 5“, всички останали стойности на този ред се губят. Това се държи правилно, както не е част от int и така маркира началото на поплавъка.

Грешка при улавяне

Обектът cin задава бит за неуспех, ако входът не е преобразуван успешно. Този бит е част от IOS и може да се чете с помощта на Fail () функция и на двете CIN и Cout като този.

 ако (cin.fail ()) // направи нещо. 

Не е изненадващо, cout.fail () рядко се задава, поне на екранен изход. В по-късен урок на файла I / O ще видим как cout.fail () може да стане истина. Има и а добре() функция за CIN, Cout и т.н.