C ++ apmācība: uzziniet par ievadi un izvadi

01

no 08

Jauns izejas veids

Programmas kods
traffic_analyzer / Getty Images

C ++ saglabā ļoti augstu atpakaļsaderību ar C, tātad var tikt iekļauts, lai dotu jums piekļuvi printf () funkcija izvadei. Tomēr C ++ nodrošinātais I / O ir ievērojami jaudīgāks un, vēl svarīgāk, tipa drošs. Jūs joprojām varat arī izmantot scanf () ievadīšanai, bet C ++ nodrošinātās drošības funkcijas nozīmē, ka lietojumprogrammas būs izturīgākas, ja izmantosit C ++.

Iepriekšējā nodarbībā tas tika apskatīts ar piemēru, kurā tika izmantots cout. Šeit mēs iedziļināsimies mazliet dziļāk, vispirms sākot ar izvadi, jo to mēdz vairāk izmantot nekā ievadi.

Iostream klase nodrošina piekļuvi objektiem un metodēm, kas nepieciešami gan izejai, gan ievadīšanai. Iedomājieties i / o baitu straumju izteiksmē - vai nu pārejot no lietojumprogrammas uz failu, ekrānu vai printeri - tas ir izvads, vai no tastatūras - tas ir ievads.

Izeja ar Cout

Ja jūs zināt C, jūs, iespējams, zināt << tiek izmantots, lai pārbīdītu bitus pa kreisi. Piemēram, 3 << 3 ir 24. Piemēram, nobīde pa kreisi divkāršo vērtību, tāpēc 3 nobīde pa kreisi reizina to ar 8.

instagram viewer

C ++, << ir bijis pārslogots ostream klasē tā, ka int, peldēt, un virkņu veidi (un to varianti, piem., dubultā) tiek atbalstīti visi. Tādā veidā jūs veicat teksta izvadi, virknes sagrupējot starp <<.>


cout << "Daži teksti" << starpvērtība << mainīga dubultā << endl; 

Šī savdabīgā sintakse ir iespējama, jo katrs no << faktiski ir funkcijas izsaukums, kas atgriež a atsauce uz straumi objekts. Tātad tāda līnija kā iepriekš, faktiski ir šāda


cout. << ("daži teksts"). cout. << (intvalue) .cout. << (floatdouble) .cout. << (endl); 

C funkcijaprintf varēja formatēt izvadi, izmantojot formāta specifikatorus, piemēram,% d. C ++ cout var arī formatēt izvadi, bet izmanto atšķirīgu paņēmienu.

02

no 08

Cout izmantošana izvades formatēšanai

Objekts cout ir loceklis iostream bibliotēka. Atcerieties, ka tas ir jāiekļauj a


# iekļaut 

Šī bibliotēka iostream ir atvasināts no ostream (izvadei) un istream par ievadi.

Formatēšana teksta izvades tiek veikts, ievietojot manipulatorus izvades straumē.

Kas ir manipulators?

Tā ir funkcija, kas var mainīt izejas (un ieejas) straumes raksturlielumus. Iepriekšējā lapā mēs to redzējām << bija pārslogota funkcija, kas atdeva atsauci uz izsaucošo objektu, piem. cout izvadei vai cin ievadei. Visi manipulatori to dara, lai jūs varētu tos iekļaut izejā << vai ievadi >>. Mēs apskatīsim ievadi un >> vēlāk šajā nodarbībā.


skaita << endl; 

endl ir manipulators, kurš beidz līniju (un sāk jaunu). Tā ir funkcija, kuru var saukt arī šādā veidā.


endls (cout); 

Lai gan praksē jūs to nedarītu. Jūs to izmantojat šādi.


cout << "Daži teksti" << endl << endl; // Divas tukšas rindas. 

Faili ir tikai straumi

Kaut kas jāpatur prātā, ka mūsdienās daudz tiek attīstīts GUI kāpēc jums būtu vajadzīgas teksta I / O funkcijas? Vai tas nav tikai priekš konsole aplikācijas? Jūs, iespējams, darīsit faila I / O un varēsit tos izmantot arī tur, bet arī formatēšanai ir nepieciešams tas, kas tiek izvadīts uz ekrānu. Straumes ir ļoti elastīgs veids, kā rīkoties ar ievadi un izvadi, un ar tām var strādāt

  • I / O teksts. Tāpat kā konsoles lietojumprogrammās.
  • Stīgas. Ērts formatēšanai.
  • Faila I / O.

Manipulatori atkal

Lai gan mēs esam izmantojuši ostream klase, tas ir a atvasināta klase no ios klase, kas izriet no ios_base. Šī senču klase nosaka sabiedrību funkcijas kas ir manipulatori.

03

no 08

Cout manipulatoru saraksts

Manipulatorus var definēt ieejas vai izejas plūsmās. Tie ir objekti, kas atgriež atsauci uz objektu un ir novietoti starp pāriem <<. Lielākā daļa manipulatoru ir deklarēti, bet endl, beidzas un flush nāk no . Vairāki manipulatori ņem vienu parametru, un tie nāk no .

Šeit ir sīkāks saraksts.

No plkst

  • endl - beidz līniju un izsauc flush.
  • beidzas - ievieto '\ 0' ( NULL) straumē.
  • flush - piespiež buferi nekavējoties izvadīt.

No plkst . Lielākā daļa ir deklarēti sencis . Es tos esmu sagrupējis pēc funkcijas, nevis alfabēta secībā.

  • boolalpha - ievietojiet vai izvelciet bool objektus kā “true” vai “false”.
  • noboolalpha - ievietojiet vai izvelciet bool objektus kā skaitliskas vērtības.
  • fiksēts - ievietojiet mainīgā komata vērtības fiksētā formātā.
  • zinātniski - ievietojiet peldošā komata vērtības zinātniskā formātā.
  • iekšējs - iekšējs - attaisnojas.
  • pa kreisi - pa kreisi attaisno.
  • labi - pareizi pamatot.
  • dec - ievietot vai izņemt veselas skaitļa vērtības decimālā formātā.
  • hex - ievietot vai izņemt vesela skaitļa vērtības heksadecimālā (16. bāze) formātā.
  • oct - ievietojiet vai izvelciet vērtības oktālajā (8. bāze) formātā.
  • noshowbase - nedodiet prefiksu ar tā bāzi.
  • showbase - prefiksa vērtība ar tās bāzi.
  • noshowpoint - nerādīt komatu, ja tas nav nepieciešams.
  • rādīšanas punkts - ievietojot peldošā komata vērtības, vienmēr parādiet decimālo komatu.
  • noshowpos - neievietojiet plus zīmi (+), ja skaitlis> = 0.
  • skatlogi - ievietojiet plus zīmi (+), ja skaitlis> = 0.
  • noskipws - ieguves laikā neizlaidiet sākotnējo balto laukumu.
  • skipws - Izlaižot sākotnējo balto laukumu.
  • lielie burti - neaizstājiet mazos burtus ar lielajiem burtiem.
  • lielais burts - aizstājiet mazos burtus ar ekvivalentiem lielajiem burtiem.
  • unitbuf - izskalojiet buferi pēc ievietošanas.
  • nounitbuf - neizskalojiet buferi pēc katras ievietošanas.

04

no 08

Piemēri, izmantojot Cout

// ex2_2cpp. #include "stdafx.h" # iekļautizmantojot namespace std; int galvenais (int argc, char * argv []) { platums (10); cout << pa labi << "Tests" << endl; cout << pa kreisi << "2. pārbaude" << endl; cout << iekšējais << "3. pārbaudījums" << endl; cout << endl; cout.precision (2); cout << 45.678 << endl; cout << lielie burti << "David" << endl; cout.precision (8); cout << zinātniskais << endl; cout << 450678762345.123 << endl; cout << fiksēts << endl; cout << 450678762345.123 << endl; cout << showbase << endl; cout << showpos << endl; cout << hex << endl; cout << 1234 << endl; cout << okt << endl; cout << 1234 << endl; cout << decembris << endl; cout << 1234 << endl; cout << noshowbase << endl; cout << noshowpos << endl; cout.unsetf (ios:: lielie burti); cout << hex << endl; cout << 1234 << endl; cout << okt << endl; cout << 1234 << endl; cout << decembris << endl; cout << 1234 << endl; atgriešanās 0; }

Rezultāts no tā ir zemāk, skaidrības labad ir noņemta viena vai divas papildu līnijas atstarpes.

 Pārbaude. 2. pārbaude. 3. pārbaude. 46. Dāvids. 4.50678762E + 011. 450678762345.12299000. 0X4D2. 02322. +1234. 4d2. 2322. 1234. 

Piezīme: Neskatoties uz lielo burtu, Dāvids ir drukāts kā Dāvids, nevis Dāvids. Tas ir tāpēc, ka lielie burti ietekmē tikai ģenerēto izvadi, piem. cipari drukāti heksadecimālais. Tātad heksa izvade 4d2 ir 4D2, kad darbojas lielie burti.

Arī vairums no šiem manipulatoriem mazliet iespiež karodziņā, un to ir iespējams iestatīt tieši ar

 cout.setf () 

un notīriet to ar

 cout.unsetf () 

05

no 08

Izmantojot Setf un Unsetf, lai manipulētu ar I / O formatēšanu

Funkcija setf ir divi pārslogots versijas, kas parādītas zemāk. Kamēr unsetf tikai notīra norādītos bitus.

 setf (karoga vērtības); setf (karoga vērtības, masku vērtības); unsetf (karoga vērtības); 

Mainīgos karodziņus iegūst no VĒLĒŠANA kopā visus vajadzīgos bitus ar |. Tātad, ja vēlaties zinātniskais, lielais burts un boolalpha tad izmantojiet šo. Tikai biti, kas ievadīti kā parametrs ir iestatīti. Pārējie biti tiek atstāti bez izmaiņām.

 cout.setf (ios_base:: zinātniskā | ios_base:: lielie burti | ios_base:: boolalpha); cout << hex << endl; cout << 1234 << endl; cout << decembris << endl; cout << 123400003744.98765 << endl; bool value = true; cout << value << endl; cout.unsetf (ios_base:: boolalpha); cout << value << endl; 

Ražo

 4D2. 1,234000E + 011. taisnība. 1. 

Maskējošie biti

Tie divi parametrs setf versijā tiek izmantota maska. Ja uzgalis ir iestatīts gan pirmajā, gan otrajā parametrā, tad tas tiek iestatīts. Ja bits ir tikai otrajā parametrā, tas tiek notīrīts. Vērtības pielāgošanas lauks, bāzes lauks un pludiņa lauks (uzskaitīti zemāk) ir salikti karogi, tas ir, vairāki karodziņi Vai gribētu kopā. Priekš pamatlauks ar vērtībām 0x0e00 ir tāds pats kā decembris | oktobris | heks. Tātad

 setf (ios_base:: hex, ios_basefield); 

notīra visus trīs karodziņus un pēc tam uzstāda heks. Līdzīgi pielāgošanas lauks ir pa kreisi | pa labi | iekšējais un pludiņa lauks ir zinātniskā | fiksēts.

Bitu saraksts

Šis enumu saraksts ir ņemts no Microsoft Visual C ++ 6.0. Faktiskās izmantotās vērtības ir patvaļīgas - cits kompilators var izmantot dažādas vērtības.

 skipws = 0x0001. unitbuf = 0x0002. lielie burti = 0x0004. showbase = 0x0008. rādīšanas punkts = 0x0010. showpos = 0x0020. pa kreisi = 0x0040. pa labi = 0x0080. iekšējais = 0x0100. decembris = 0x0200. oktobris = 0x0400. heksa = 0x0800. zinātniskais = 0x1000. fiksēts = 0x2000. boolalpha = 0x4000. pielāgošanas lauks = 0x01c0. bāzes lauks = 0x0e00, pludiņa lauks = 0x3000. _Fmtmask = 0x7fff, _Fmtzero = 0. 

06

no 08

Par Klogu un Keru

Patīk cout, aizsērēt un cerr ir iepriekš definēti objekti, kas definēti straumē. Iostream klase manto no abiem ostream un istream tāpēc tāpēc cout piemērus var izmantot iostream.

Buferēts un nesadalīts

  • Buferēts - visa izvade tiek īslaicīgi saglabāta a buferis un pēc tam vienā piegājienā tika izmests uz ekrānu. Gan cout, gan aizsērējumi tiek buferēti.
  • Bez bufera - visa izeja nekavējoties nonāk izejas ierīcē. Nepiespiesta objekta piemērs ir cerr.

Zemāk sniegtais piemērs parāda, ka cerr tiek izmantots tāpat kā cout.


# iekļaut izmantojot namespace std; int _tmain (int argc, _TCHAR * argv []) {cerra platums (15); cerr.pareizi; cerr << "Kļūda" << endl; atgriešanās 0; }

Buferizācijas galvenā problēma ir, ja programma avarē, tiek zaudēts bufera saturs, un ir grūtāk saprast, kāpēc tas cieta. Nesagregāta izvade ir tūlītēja, tāpēc, iespējams, noderēs dažu šādu līniju pārkaisīšana ar kodu.

 cerr << "Bīstamas funkcijas ievadīšana zappit" << endl; 

Mežizstrādes problēma

Programmas notikumu žurnāla izveidošana var būt noderīgs veids, kā pamanīt sarežģītas kļūdas - tādas, kādas rodas tikai šad un tad. Ja tomēr šis notikums ir avārija, jums ir problēma - vai pēc katra zvana izskalojat žurnālu uz diska, lai varētu redzēt notikumus līdz avārijai vai paturiet to buferī un periodiski izskalojiet buferi, un ceru, ka avārijas laikā nezaudēsit pārāk daudz notiek?

07

no 08

Cin izmantošana ievadei: formatētā ievade

Ir divu veidu ievadīšana.

  • Formatēts. Ievades nolasīšana kā skaitļi vai noteikta veida.
  • Neformatēts. Lasīšanas baiti vai stīgas. Tas dod daudz lielāku kontroli pār ievades plūsmu.

Šeit ir vienkāršs formatētas ievades piemērs.

 // excin_1.cpp: nosaka konsoles lietojumprogrammas sākuma punktu. #include "stdafx.h" // Tikai Microsoft. # iekļaut izmantojot namespace std; int galvenais (int argc, char * argv []) { int a = 0; pludiņš b = 0,0; int c = 0; cout << "Lūdzu, ievadiet int, pludiņu un int, kas atdalīti ar atstarpēm" <> a >> b >> c; cout << "Jūs ievadījāt" << a << "" << b << "" << c << endl; atgriešanās 0; }

Ar cin palīdzību tiek nolasīti trīs cipari (int, peldēt, int) atdalītas ar atstarpēm. Pēc numura ievadīšanas jums ir jānospiež enter.

3 7.2 3 parādīs "Jūs ievadījāt 3 7.2 3".

Formatētajai ievadei ir ierobežojumi!

Ja ievadāt 3.76 5 8, tiek parādīts uzraksts “Jūs ievadījāt 3 0.76 5”, tiek zaudētas visas citas vērtības šajā rindā. Tas rīkojas pareizi, tāpat kā. neietilpst int un tādējādi iezīmē pludiņa sākumu.

Kļūda slazdošanā

Cin objekts iestata neveiksmes bitu, ja ieeja nav veiksmīgi pārveidota. Šis bits ir daļa no ios un to var izlasīt, izmantojot neizdoties () funkcija abiem cin un cout kā šis.

 if (cin.fail ()) // dari kaut ko. 

Nav pārsteidzoši, cout.fail () tiek iestatīts reti, vismaz uz ekrāna izejas. Vēlākā nodarbībā par faila I / O mēs redzēsim, kā cout.fail () var kļūt patiess. Ir arī a labs () funkcija cin, cout utt.

instagram story viewer