Bij informatica is de console het computertoetsenbord en de computermonitor. In het verleden werd uitvoer rechtstreeks naar het beeldscherm gestuurd en niet naar een venster dat op de monitor werd weergegeven. Voor de gewone computergebruiker gebruiken applicaties tegenwoordig de monitor niet expliciet. Deze toepassingen gebruiken vensters die op de monitor worden weergegeven. De computerprogrammeur moet echter nog steeds het beeldscherm gebruiken. Hoewel de programmeur nog steeds het beeldscherm moet gebruiken, staat het besturingssysteem hem dat niet toe. Het besturingssysteem biedt een venster dat het beeldscherm simuleert. In het Windows-besturingssysteem wordt dit venster de opdrachtprompt genoemd. In het Linux-besturingssysteem en zijn varianten wordt dit venster de terminal genoemd.
Er wordt verwacht dat de lezer al weet hoe hij de opdrachtprompt of de terminal moet gebruiken. In dit artikel wordt uitgelegd hoe u tekens en tekenreeksen van het toetsenbord kunt lezen en tekens en tekenreeksen naar de terminal (of opdrachtprompt) kunt sturen. Elke C++ programmeur moet het weten in dit artikel.
Om invoer van het toetsenbord en uitvoer naar de terminal te hebben, moet het programma beginnen met:
#erbij betrekken
gebruik makend van naamruimteuur;
Artikel Inhoud
- Smalle stroomobjecten van de standaard iostream
- Tekens en tekenreeksen verkrijgen van het toetsenbord
- Tekens weergeven en verwijderen voordat u op Enter drukt
- Tekens en tekenreeksen naar de monitor verzenden
- Argumenten voor een C++-programma
- Conclusie
Smalle stroomobjecten van de standaard iostream
De iostream-klasse, de standaardobjecten, cout, cin, cerr en clog, zijn geïnstantieerd en staan al in de standaardbibliotheek. De programmeur gebruikt ze gewoon zonder ze opnieuw te instantiëren.
kosten
Het volgende statement in de main() functie stuurt de tekst, This is output. naar de terminal:
kosten << 'Dit is uitvoer.';
cout is een output iostream-object in de standaardbibliotheek, al geïnstantieerd.<< is the insertion operator, which sent the bytes, This is output. to the output stream object, cout. When the statement is executed, the text appears on the screen.
Met de bovenstaande instructie verschijnt de opnieuw weergegeven opdrachtprompt rechts van de uitvoerzin. Het gaat niet naar de volgende regel. endl aan het einde van de volgende instructie dwingt alles wat door het scherm wordt afgedrukt naar de volgende regel:
kosten << 'Dit is uitvoer.' <<eindel;
endl is een vooraf gedefinieerde variabele. Scherminhoud kan ook naar de volgende regel worden geforceerd met:
kosten << 'Dit is uitvoer.' << 'N';Met het gebruik van ‘ ’ kunnen nog steeds niet alle regels tekst direct op het scherm verschijnen. endl spoelt de volledige tekstregel naar het scherm.
Opmerking: een tekenreeks die naar cout wordt verzonden, staat tussen dubbele aanhalingstekens, terwijl een teken dat wordt verzonden tussen enkele aanhalingstekens staat. Een reeks tekenreeksen en tekens kan in één instructie worden verzonden, elk voorafgegaan door<< . All that will appear in one line at the output if ‘ ’ is not in the series.
gin
cin is het standaard iostream-invoerobject, al geïnstantieerd en beschikbaar in de standaardbibliotheek. Overweeg het volgende codesegment in de functie main():
chartekst[vijftig];kosten << 'Voer een woord in en druk op Enter:' tekst;
kosten <<tekst<<eindel;
De eerste instructie declareert een lege array van 50 tekens. De tweede instructie geeft de gebruiker de opdracht om een woord in te typen op de volgende schermregel en op Enter te drukken. Let op het gebruik van 'endl' dat de gebruiker dwingt tekst in te voeren op de volgende regel van het scherm. Terwijl de gebruiker tekst typt, wordt de ingevoerde tekst op het scherm weergegeven terwijl deze in het cin-object gaat. Nadat u op Enter heeft gedrukt, wordt de derde instructie in het codesegment uitgevoerd. Dit derde statement stuurt de ingevoerde tekst naar de variabele txt. De ingevoerde tekst mag in dit geval niet langer zijn dan 50 tekens. Let op het gebruik van de extractie-operator, >>. De laatste verklaring toont de ingevoerde tekst op het scherm.
cin kan meer dan één woord van het toetsenbord halen, gescheiden door spaties. Deze woorden zullen in verschillende variabelen moeten worden geëxtraheerd. Het volgende codesegment illustreert dit:
chartekst[twintig];inthet;
vlotft;
kosten << 'Voer 3 waarden in en druk op Enter:' tekst>>het>>ft;
kosten <<tekst<< '' <<het<< '' <<ft<<eindel;
Let op de verklaring:
gin >>tekst>>het>>ft;Het eerste woord wordt geëxtraheerd naar txt, het volgende en het laatste naar ft. Als de invoer was,
een25 3.6dan zou de uitvoer van het codesegment zijn,
een25 3.6zeker
Het volgende programma heeft een fout:
#erbij betrekkengebruik makend van naamruimteuur;
inthoofd()
{
in mijnInt;
opbrengst 0;
}
De eerste instructie in main() is niet correct. Als de naam van het bestand met de code temp.cc is en het resulterende uitvoerbare bestand temp moet heten, dan zal de volgende g++-opdracht de compilerfoutmelding naar het bestand error.txt sturen:
G++ -o temp temp.gelijkstroom 2>fout.tekstAls het bestand error.txt niet bestaat, wordt het aangemaakt. Let op het gedeelte 2>error.txt van het g++-commando.
Het scherm is de standaarduitvoerbestemming en het is ook de standaardfoutbestemming. Als 2>error.txt wordt weggelaten uit het g++-commando, dan wordt de compilerfoutmelding naar de standaardfoutbestemming gestuurd, wat nog steeds het scherm (monitor) is.
Het stream-object dat de standaarduitvoerbestemming vertegenwoordigt, is cout. Het stream-object dat de standaardfoutbestemming vertegenwoordigt, is cerr. Een runtime-fout van het programma kan als volgt naar het scherm worden verzonden:
zeker << 'De foutmelding!' << 'N';verstoppen
Een applicatie neemt verschillende inputs op verschillende tijdstippen. Alle ingangen kunnen opnieuw op het scherm worden weergegeven. Alle invoer kan in een bestand worden opgeslagen. Dit is loggen. De standaard logbestemming is het scherm. Het standaard logstroomobject is een klomp. Met de volgende code wordt de invoertekst opnieuw op het scherm weergegeven:
chartekst[vijftig];kosten<<'Voer tekst in en druk op Enter:'tekst;
verstoppen<<tekst<<eindel;
Als de invoertekst 'input_text' is, zou clog 'input_text' opnieuw op het scherm weergeven.
In de praktijk wordt loggen meestal omgeleid naar een bestand. Het volgende programma illustreert dit:
#erbij betrekkengebruik makend van naamruimteuur;
inthoofd()
{
vrijopenen( 'log.txt','in',stout);
kosten << 'invoertekst' <<eindel;
}
Let op het gebruik van de functie, freopen(), en zijn argumenten. Het eerste argument is de naam van het logbestand. Als het bestand niet bestaat, wordt het aangemaakt. Het tweede argument is 'w' voor 'schrijven'. Het derde argument is stdout voor standaarduitvoer. De tweede instructie in de main()-functie gebruikt cout om de logtekst naar het bestand te sturen. Let op: De daadwerkelijke invoercode is niet getoond in dit programma.
Tekens en tekenreeksen verkrijgen van het toetsenbord
Terwijl de gebruiker invoer typt, worden de tekens naar de invoerstroombuffer gestuurd en op het scherm weergegeven. Wanneer de gebruiker op de Enter-toets drukt, bevinden alle tekens zich in de buffer; ook gaat de cursor naar het begin van de volgende regel eronder, op het scherm. Het programma gaat dan verder naar de volgende programma-instructie, na de invoer-leesinstructie.
Het cin-object heeft methoden waar deze sectie zich mee bezighoudt.
Het eerste karakter lezen
get(char_type& c):
Het volgende codesegment laat zien hoe u het eerste teken uit de invoerstroombuffer kunt lezen:
kosten << 'Invoer tekst:' <<eindel;
gin.krijgen(ch);
kosten <<ch<<eindel;
De eerste verklaring declareert een teken zonder toewijzing. De tweede instructie vertelt de gebruiker om een teken in te voeren. Wanneer de gebruiker een teken typt en op de Enter-toets drukt, kopieert de derde instructie het teken uit de invoerstroombuffer naar de variabele, ch.
Zelfs als de gebruiker meer dan één teken intypt, wordt het eerste teken overgenomen door het codesegment.
krijgen():
get() zonder argument, retourneert de decimale ASCII-code. Overweeg het volgende codesegment:
kosten << gin.krijgen() <<eindel;
Als de invoer 'asdfg' is, wordt 97 geretourneerd, wat de decimale ASCII-code voor 'a' is.
get(char_type* s, streamgrootte n)
Nadat de gebruiker een zin heeft ingevoerd en op de Enter-toets heeft gedrukt, kan een aantal tekens vanaf de eerste worden geëxtraheerd uit de cin-stroombuffer. De volgende code kan worden gebruikt:
charP[10];kosten << 'Invoer tekst:' <<eindel;
gin.krijgen(str,10);
kosten <<P<<eindel;
Als de invoer 'geweldige mensen' is, dan is de uitvoer 'geweldige mensen', van 9 tekens en niet 10. Het teken NUL-tekenreeks ( ) neemt de tiende positie in het get-argument in. Dus om 9 tekens in str te hebben, moet de opslaggrootte minimaal 10 zijn en moet het argument get() 11 zijn. Als de hele invoerregel gewenst is, moet het opslagnummer van de string minimaal het getal zijn aantal getypte tekens, plus 1. Dus als 12 tekens worden getypt voor de hele regel, dan moet het getal 13 zijn voor de string (str) opslaggrootte en 13 voor het argument get(). Merk op dat één spatie als één teken wordt geteld.
get(char_type* s, streamsize n, char_type delim)
Het is mogelijk om een substring te extraheren, aan de rechterkant begrensd door het eerste voorkomen van een bepaald teken, of door de stroomgrootte van de substring, wat het eerst komt. Als de invoertekst voor de volgende code geweldige mensen is, zou geweldig worden geëxtraheerd:
kosten << 'Invoer tekst:' <<eindel;
gin.krijgen(str,6,'of');
kosten <<P<<eindel;
De zesde positie vanaf het begin is het spatieteken en het begrenst uitsluitend de geëxtraheerde subtekenreeks. De zesde positie komt eerst voor het enige teken, 'o'. Merk op dat de opslaggrootte voor str zo hoog mogelijk kan zijn.
Als de invoertekst voor de volgende code geweldige mensen is, wordt gr geëxtraheerd:
charP[30];kosten << 'Invoer tekst:' <<eindel;
gin.krijgen(str,10,'En');
kosten <<P<<eindel;
De eerste keer dat 'e' voorkomt, komt eerst voor de tiende positie.
Alle karakters van een regel krijgen
Nadat u op de Enter-toets hebt gedrukt, kunnen alle tekens die in de regel zijn getypt, worden opgehaald zoals weergegeven in de volgende code:
kosten << 'Invoer tekst:' <<eindel;terwijl (1) {
charch= (char)gin.krijgen();
kosten <<ch;
indien (ch== 'N')
pauze;
}
De casting met (char), converteert elk decimaal getal naar het overeenkomstige ASCII-teken.
kijkje()
De get() lidfuncties lezen niet alleen het volgende teken; ze verwijderen het uit de streambuffer. De lidfunctie peek() leest echter eenvoudig het volgende teken (beginnend bij het eerste) zonder het uit de buffer te verwijderen. In de volgende code wordt elk teken eerst gelezen met de functie peek() voordat het wordt verwijderd door de functie get(). Dat gebeurt allemaal nadat de gebruiker op de Enter-toets heeft gedrukt:
kosten << 'Invoer tekst:' <<eindel;terwijl (1) {
charch= (char)gin.kijkje();
kosten <<ch;
gin.krijgen();
indien (ch== 'N')
pauze;
}
Als de volgende tekens niet werden verwijderd door get(), zou peek() alleen het eerste teken lezen en zal de lus oneindig herhalen.
Tekens weergeven en verwijderen voordat u op Enter drukt
Merk op dat bij het cin-object de Enter-toets moet worden ingedrukt voordat er actie wordt ondernomen. Welnu, het is mogelijk dat tekens worden weergegeven terwijl ze worden getypt en gewist voordat op de Enter-toets wordt gedrukt. Dat betekent echter een interface met het besturingssysteem. Besturingssystemen verschillen. Dit betekent dus verschillende codering voor verschillende besturingssystemen. Dit onderwerp verdient dus een heel andere tutorial - zie later.
Tekens en tekenreeksen naar de monitor verzenden
Het cout-object is een outputstream-object, dat al is geïnstantieerd en aanwezig is in de standaardbibliotheek van C++. cout is het hoofdobject dat wordt gebruikt bij het verzenden van tekens en tekenreeksen naar de monitor. Dit wordt gedaan met de invoegoperator,<< . With the cin object, the text is obtained line-by-line. With the cout object, the text is added onto the same line until ‘ ’ or endl is encountered.
Expressies die resulteren in scalaire waarden kunnen argumenten zijn voor de invoegoperator. De operator zet de scalaire waarde om in tekst en plaatst de tekst in de cout-objectstroom. Wanneer er tekst naar het cout-object wordt gestuurd, verschijnt deze normaal gesproken op het scherm (monitor). Soms verschijnt het echter niet onmiddellijk. Om tekst op het scherm te forceren, voegt u de speciale waarde, endl, in net na het invoegen van de tekst. Hierdoor wordt de tekst naar het scherm gespoeld en wordt er een nieuwe regel toegevoegd. Opmerking: ' ' voegt gewoon een nieuwe regel toe, maar spoelt de tekst niet door op het scherm.
Het volgende programma laat zien hoe u de waarden van int, float en gewone tekst op het scherm kunt afdrukken:
#erbij betrekkengebruik makend van naamruimteuur;
inthoofd()
{
inthet= 5;
vlotft= 63.5;
kosten << 'De ' <<het<< ' artikelen kosten $' <<ft<< ' ONS.' <<eindel;
opbrengst 0;
}
De uitvoer is:
De5artikelen kosten $63.5ONS.Het volgende programma laat zien hoe de string van een object dat is geïnstantieerd vanuit een klasse wordt afgedrukt:
#erbij betrekkengebruik makend van naamruimteuur;
structurerenNS{
charP[elf] = 'sommige woorden';
}obj;
inthoofd()
{
kosten <<obj.P << 'N';
opbrengst 0;
}
De output is 'sommige woorden'.
Argumenten voor een C++-programma
De uitvoering van het programma begint vanaf de functie main(). De functie main() heeft eigenlijk twee optionele parameters. De syntaxis van de functie main() met de optionele parameters is:
inthoofd(intargc,char *argv[argc]){
opbrengst 0;
}
Stel dat de naam van het uitvoerbare C++-bestand temp. Neem aan dat de argumenten die het programma nodig heeft van zijn omgeving (besturingssysteem), getypt door de gebruiker, is,
Lidwoord3boek pen'groot huis'Er zijn hier 5 argumenten: artikelen, 3, boek, pen en groot huis
Elk is tekst. Een genummerd argument voor een programma is tekst. Met andere woorden, elk argument is een string. groot huis staat tussen aanhalingstekens omdat het een zin is. De terminalopdracht om dit programma uit te voeren zou zijn:
./tijdelijke artikelen3boek pen'groot huis'Ervan uitgaande dat het bestand temp zich in de homedirectory bevindt. Merk op dat spaties en geen komma's de argumenten scheiden.
In de syntaxis van de functie main() is argc het aantal argumenten voor het programma plus 1. In dit geval zijn er 5 argumenten voor het programma. Dus argc is 6. In de syntaxis is argv[argc] een array van verwijzingen naar strings. De eerste waarde voor deze array op argv[0] wordt gegeven door de compiler. Het is een verwijzing naar de naam van het programmabestand. De rest van de waarden zijn verwijzingen naar de programmaargumenten in de door de gebruiker ingetypte volgorde. De grootte van deze array is argc. In dit geval is de maat 1 + 5 = 6.
Neem aan dat bij compilatie het volgende programma temp heet:
#erbij betrekkengebruik makend van naamruimteuur;
inthoofd(intargc,char**argv)
{
kosten <<argv[0] << ',' <<argv[1] << ',' <<argv[2] << ',' <<argv[3] << ',' <<argv[4] << ',' <<argv[5] <<eindel;
opbrengst 0;
}
Merk hier op dat de array 'char *argv[argc]' gedeclareerd is als 'char** argv'.
Als dit programma wordt uitgevoerd met de opdracht terminal,
./tijdelijke artikelen3boek pen'groot huis'dan zou de output zijn:
./temperatuur, artikelen,3, boek, pen, groot huisMerk op dat het mappad is opgenomen in de naam van het uitvoerbare bestand.
Merk ook op dat tijdens het uitvoeren van het programma (aanroepen van het programma), de waarde voor argc niet is verzonden.
Conclusie
De klasse iostream heeft vier belangrijke objecten die cout, cin, cerr en clog zijn. cin is een invoerobject, terwijl de rest uitvoerobjecten zijn. Terwijl een programma loopt, is de invoer in het programma anders dan wanneer het programma moet beginnen te lopen. Wanneer een programma begint te lopen, wordt de invoer voor het programma samengevoegd met de opdracht om het programma uit te voeren, gescheiden door spaties.