Zarządzanie konsolą z klasami iostream w C ++

Zarządzanie konsolą z klasami iostream w C ++
W obliczeniach konsola to klawiatura komputerowa i monitor komputerowy. W przeszłości wyjście zostało wysłane bezpośrednio do ekranu monitora, a nie do okna wyświetlanego na monitor. Dla zwykłego użytkownika komputera aplikacje dzisiaj nie używają monitora. Te aplikacje korzystają z systemu Windows wyświetlanych na monitorze. Jednak programista komputerowy nadal musi korzystać z ekranu monitora. Chociaż programista nadal musi korzystać z ekranu monitora, system operacyjny nie pozwala mu na to. System operacyjny zapewnia okno, które symuluje ekran monitora. W systemie operacyjnym Windows to okno jest wywoływane przez wiersz polecenia. W systemie operacyjnym Linux i jego wariantach to okno nazywa się terminalem.

Oczekuje się, że czytelnik już wie, jak korzystać z wiersza polecenia lub terminala. W tym artykule wyjaśniono, jak czytać znaki i struny z klawiatury i wysyłać znaki i struny do terminala (lub wiersza polecenia). Każdy programista C ++ musi wiedzieć w tym artykule.

Aby mieć dane wejściowe z klawiatury i wyjścia do terminala, program musi się rozpocząć od:

#włączać
za pomocą przestrzeni nazw Std;

Treść artykułu

  • Wąskie obiekty strumienia standardowego iostream
  • Uzyskanie znaków i ciągów z klawiatury
  • Wyświetlanie i usuwanie znaków przed naciśnięciem Enter
  • Wysyłanie znaków i ciągów do monitora
  • Argumenty dotyczące programu C ++
  • Wniosek

Wąskie obiekty strumienia standardowego iostream

Klasa iostream, standardowe obiekty, cout, CIN, CERR i CALOT, zostały utworzone i już w standardowej bibliotece. Programista po prostu używa ich bez ponownego tworzenia ich instancji.

Cout

Poniższa instrukcja w funkcji Main () wysyła tekst: „To jest wyjście.„Do terminalu:

Cout << "This is output.";

Cout to wyjściowy obiekt iostream w standardowej bibliotece, już utworzony. << 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.

Z powyższym instrukcją ponowna obduplacja wiersza polecenia pojawia się po prawej stronie wyrażenia wyjściowego. Nie przechodzi do następnej linii. „ENDL” na końcu następującego stwierdzenia zmusi wszystko, co jest wydrukowane przez ekran do następnego wiersza:

Cout << "This is output." << endl;

„ENDL” jest predefiniowaną zmienną. Treść ekranu może być również zmuszona do następnego wiersza z:

Cout << "This is output." << '\n';

Za pomocą „\ n” wszystkie wiersze tekstu mogą nadal nie pojawiać się na ekranie. „ENDL” spłukuje pełną linię tekstu do ekranu.

Uwaga: ciąg wysłany do Cout jest w podwójnych cytatach, a postać wysłana jest w pojedynczych cytatach. Seria ciągów i znaków można wysłać w jednym stwierdzeniu, każde poprzedzone przez << . All that will appear in one line at the output if '\n' is not in the series.

Cin

CIN jest standardowym obiektem wejściowym iostream, już utworzonym i dostępnym w standardowej bibliotece. Rozważ następujący segment kodu w funkcji Main ():

char txt [50];
Cout << "Enter a word and press Enter:" txt;
Cout << txt << endl;

Pierwsze stwierdzenie deklaruje pustą tablicę 50 znaków. Druga instrukcja instruuje użytkownika, aby wpisał słowo na następnym wierszu ekranu i naciśnij klawisz Enter. Zwróć uwagę na użycie „ENDL”, które zmusza użytkownika do wprowadzania tekstu w następnym wierszu ekranu. Według tekstu użytkowników wprowadzony tekst jest powtórzony do ekranu, gdy trafia do obiektu CIN. Po naciśnięciu ENTER, trzecia instrukcja w segmencie kodu jest wykonywana. To trzecie oświadczenie wysyła wprowadzony tekst do zmiennej, TXT. Wprowadzony tekst nie powinien być w tym przypadku dłuższy niż 50 znaków. Zwróć uwagę na użycie operatora ekstrakcji, >>. Ostatnia instrukcja wyświetla wprowadzony tekst na ekranie.

CIN może wziąć więcej niż jedno słowo z klawiatury, oddzielone przestrzeniami. Te słowa będą musiały zostać wyodrębnione w różnych zmiennych. Poniższy segment kodu to ilustruje:

char txt [20];
It;
float ft;
Cout << "Enter 3 values and press Enter:" txt >> it >> ft;
Cout << txt << " << it << " << ft << endl;

Zwróć uwagę na stwierdzenie:

cin >> txt >> it >> ft;

Pierwsze słowo jest wyodrębnione do txt, następnego i ostatniego do ft. Jeśli dane wejściowe,

jeden 25 3.6

wtedy wyjście według segmentu kodu byłoby,

jeden 25 3.6

Cerr

Poniższy program ma błąd:

#włączać
za pomocą przestrzeni nazw Std;
int main ()

w myint;
powrót 0;

Pierwsze stwierdzenie w Main () jest nieprawidłowe. Jeśli nazwa pliku posiadającego kod to „Temp.CC ”, a wynikowy plik wykonywalny ma być nazywany„ Temp ”, wówczas następujące polecenie G ++ wyśle ​​komunikat o błędzie kompilatora do pliku:„ Błąd.tekst":

Temp g ++ -o.CC 2> Błąd.tekst

Jeśli plik „Błąd.txt ”nie istnieje, zostanie utworzony. Zwróć uwagę na błąd „2>.txt ”polecenia G ++.

Ekran jest standardowym miejscem wyjściowym, a także standardowym miejscem docelowym błędu. Jeśli „2> błąd.TXT ”jest pominięte w poleceniu G ++, wówczas komunikat o błędzie kompilatora zostanie wysłany do miejsca docelowego błędu standardowego, który nadal jest ekranem (monitor).

Obiekt strumienia reprezentujący standardowy cel wyjściowy to Cout. Obiekt strumieniowy reprezentujący standardowy cel błędu jest CERR. Błąd środowiska wykonawczego programu można wysłać na ekran w następujący sposób:

Cerr << "The error message!" << '\n';

zatkać

Aplikacja przyjmuje różne dane wejściowe w różnych momentach. Wszystkie dane wejściowe można ponownie podzielić na ekranie. Wszystkie wejścia można zapisać w pliku. To jest rejestrowanie. Standardowe miejsce do rejestrowania to ekran. Standardowy obiekt strumienia rejestrowania jest zatykanie. Poniższy kod zostanie ponownie podzielony tekst wejściowy na ekran:

char txt [50];
Cout<<"Enter text and press Enter:"txt;
zatkać<

Jeśli tekst wejściowy to „input_text”, wówczas Clog ponownie zakazałby „input_text” na ekran.

W praktyce rejestrowanie jest zwykle przekierowywane do pliku. Poniższy program ilustruje to:

#włączać
za pomocą przestrzeni nazw Std;
int main ()

Freopen ("Log.txt "," w ", stdout);
Cout << "input_text" << endl;

Zwróć uwagę na użycie funkcji, freopen () i jej argumentów. Jego pierwszym argumentem jest nazwa pliku dziennika. Jeśli plik nie istnieje, zostanie on utworzony. Jego drugim argumentem jest „W” dla „Write”. Jego trzecim argumentem jest stdout dla standardowego wyjścia. Druga instrukcja w funkcji main () używa Cout do wysyłania tekstu rejestrowania do pliku. Uwaga: rzeczywisty kod wejściowy nie został pokazany w tym programie.

Uzyskanie znaków i ciągów z klawiatury

Podczas gdy użytkownik wpisuje wprowadzanie, znaki są wysyłane do bufora strumienia wejściowego i wyświetlane na ekranie. Gdy użytkownik naciska klawisz Enter, wszystkie znaki znajdują się w buforze; Kursor przechodzi na początek następnego wiersza poniżej, na ekranie. Następnie program kontynuuje następną instrukcję programu, po instrukcji odczytu wejściowego.

Obiekt CIN ma metody, na które dotyczy tej sekcji.

Czytanie pierwszej postaci

Get (Char_Type i c):
Poniższy segment kodu pokazuje, jak odczytać pierwszy znak, z bufora strumienia wejściowego:

char ch;
Cout << "Input text:" << endl;
Cin.Get (CH);
Cout << ch << endl;

Pierwsze oświadczenie deklaruje postać bez przypisania. Druga instrukcja informuje użytkownika, aby wprowadził znak. Gdy użytkownik ma charakter i naciska klawisz Enter, trzecia instrukcja kopiuje znak z bufora strumienia wejściowego do zmiennej, CH.

Nawet jeśli użytkownik wpisał więcej niż jeden znak, pierwszy znak zostałby przejęty przez segment kodu.

Dostawać():
get () bez argumentu, zwraca dziesiętny kod ASCII. Rozważ następujący segment kodu:

Cout << "Input text:" << endl;
Cout << cin.get() << endl;

Jeśli wejście jest „asdfg”, wówczas 97 zostanie zwrócone, czyli dziesiętny kod ASCII dla „A”.

get (char_type* s, strumień n)

Po wprowadzeniu przez użytkownika frazę i naciska klawisz Enter, wiele znaków zaczyna się od pierwszego, można wyodrębnić z bufora strumieniowego CIN. Można użyć następującego kodu:

char str [10];
Cout << "Input text:" << endl;
Cin.Get (STR, 10);
Cout << str << endl;

Jeśli dane wejściowe to „świetni ludzie”, to wyjście będzie „świetne peo”, 9 znaków, a nie 10. Znak struny nul (\ 0) zajmuje dziesiątą pozycję w argumencie get. Aby mieć 9 znaków w STR, jego rozmiar przechowywania musi wynosić co najmniej 10, a argument get () musi wynosić 11. Jeśli cała linia wejściowa jest pożądana, wówczas numerem pamięci ciągu musi być co najmniej liczba wpisanych znaków, plus 1. Jeśli więc wpisano 12 znaków dla całej linii, liczba powinna wynosić 13 dla rozmiaru pamięci String (Str) i 13 dla argumentu get (). Zauważ, że jedno miejsce jest liczone jako jedna postać.

GET (Char_Type* S, strumień N, Char_Type DeLim)
Możliwe jest wyodrębnienie sub-drestringu, ograniczonego po prawej, przez pierwsze wystąpienie konkretnej postaci lub przez strumień podtw. Jeśli tekst wejściowy do następującego kodu to „świetni ludzie”, to „świetny” zostanie wyodrębniony:

char str [30];
Cout << "Input text:" << endl;
Cin.Get (str, 6, „o”);
Cout << str << endl;

Szósta pozycja od samego początku jest znakiem kosmosu i wyznacza wyłącznie wyodrębnione podłoże. Szósta pozycja jest najważniejsza przed jedyną postacią „o”. Zauważ, że rozmiar przechowywania dla STR może być tak wysoki, jak to możliwe.

Jeśli tekst wejściowy do następującego kodu to „świetni ludzie”, to „GR” zostanie wyodrębnione:

char str [30];
Cout << "Input text:" << endl;
Cin.Get (str, 10, „e”);
Cout << str << endl;

Pierwsze wystąpienie „e” jest najważniejsze przed dziesiątą pozycją.

Zdobycie wszystkich postaci linii

Po naciśnięciu klawisza Enter, wszystkie znaki wpisane w wierszu można uzyskać, jak pokazano w następującym kodzie:

Cout << "Input text:" << endl;
while (1)
char ch = (char) cin.Dostawać();
Cout << ch;
if (ch == '\ n')
przerwa;

Odlew z (char) przekształca każdą liczbę dziesiętną w odpowiedni charakter ASCII.

zerkać()

Funkcje członka get () nie tylko odczytują następny znak; Usuwają go z bufora strumienia. Jednak funkcja członka PEEK () prosta odczytuje następny znak (zaczynając od pierwszego) bez usuwania go z bufora. W poniższym kodzie każdy znak jest najpierw odczytany z funkcją PEEK () przed usunięciem, przez funkcję get (). Wszystko, co dzieje się po naciśnięciu klawisza Enter:

Cout << "Input text:" << endl;
while (1)
char ch = (char) cin.zerkać();
Cout << ch;
Cin.Dostawać();
if (ch == '\ n')
przerwa;

Gdyby następne znaki nie zostały usunięte przez get (), Peek () czytałby tylko pierwszą postać, a pętla iterowana jest w nieskończoność.

Wyświetlanie i usuwanie znaków przed naciśnięciem Enter

Zauważ, że w przypadku obiektu CIN klawisz ENTER musi zostać naciśnięty, zanim nastąpi działania. Cóż, możliwe jest wyświetlanie znaków podczas wpisywania i usunięcia przed naciśnięciem klawisza Enter. Oznacza to jednak kontakt z systemem operacyjnym. Systemy operacyjne różnią się. Oznacza to inne kodowanie dla różnych systemów operacyjnych. Więc ten temat zasługuje na zupełnie inny samouczek - patrz później.

Wysyłanie znaków i ciągów do monitora

Obiekt Cout jest obiektem strumienia wyjściowego, już utworzonego i obecnego w standardowej bibliotece C ++. Cout jest głównym obiektem używanym do wysyłania znaków i ciągów do monitora. Odbywa się to z operatorem insercji, << . With the cin object, the text is obtained line-by-line. With the cout object, the text is added onto the same line until '\n' or endl is encountered.

Wyrażenia powodujące skalary mogą być argumentami dla operatora wstawiania. Operator przekształca skalar w tekst i umieszcza tekst w strumieniu obiektu Cout. Gdy tekst jest wysyłany do obiektu Cout, zwykle pojawia się on na ekranie (monitor). Jednak czasami może nie pojawić się natychmiast. Aby zmusić tekst na ekran, wstaw specjalną wartość „Endl” tuż po włożeniu tekstu. Spowoduje to, że tekst zostanie wypłukany na ekran, a zostanie dodana nowa linia. Uwaga: „\ n 'po prostu dodaje nową linię, ale nie przepycha tekstu do ekranu.

Poniższy program pokazuje, jak wydrukować wartości INT, Float i zwykłego tekstu na ekranie:

#włączać
za pomocą przestrzeni nazw Std;
int main ()

int it = 5;
float ft = 63.5;
Cout << "The " << it << " items cost $" << ft << " US." << endl;
powrót 0;

Wyjście to:

5 pozycji kosztuje 63 USD.5 Us.

Poniższy program pokazuje, w jaki sposób wydrukowany jest ciąg obiektu utworzonego z klasy:

#włączać
za pomocą przestrzeni nazw Std;
struct st
char str [11] = "niektóre słowa";
obj;
int main ()

Cout << obj.str << '\n';
powrót 0;

Wyjście to „niektóre słowa”.

Argumenty dotyczące programu C ++

Wykonanie programu zaczyna się od funkcji Main (). Funkcja main () ma faktycznie dwa opcjonalne parametry. Składnia funkcji main () z opcjonalnymi parametrami jest:

int main (int argc, char *argv [argc])

powrót 0;

Załóżmy, że nazwa pliku wykonywalnego C ++ to „Temp”. Załóżmy, że argumenty, których program potrzebuje ze swojego środowiska (system operacyjny), wpisany przez użytkownika, jest,

Artykuły 3 książka „Big House”

Jest tutaj 5 argumentów: „Artykuły”, „3”, „książka”, „pióra” i „Big House”

Każdy to tekst. Prezentowany argument programu to tekst. Innymi słowy, każdy argument jest ciągiem. „Big House” jest w cytatach, ponieważ jest to zdanie. Poleceniem terminali do uruchomienia tego programu byłoby:

./Temp Artykuły 3 Pióro książki „Big House”

Zakładając, że temperatura pliku znajduje się w katalogu domowym. Zauważ, że przestrzenie i przecinki oddzielają argumenty.

Teraz, w składni funkcji main () Argc to liczba argumentów dla programu plus 1. W takim przypadku istnieje 5 argumentów dotyczących programu. ARGC ma 6. W składni argv [argc] jest szeregiem wskazówek do strun. Pierwsza wartość tej tablicy w Argv [0] jest podana przez kompilator. Jest to wskaźnik nazwy pliku programu. Reszta wartości to wskaźniki argumentów programu w wpisanym zamówieniu użytkownika. Rozmiar tej tablicy to argc. W takim przypadku rozmiar wynosi 1 + 5 = 6.

Załóżmy, że przy kompilacji następujący program nazywa się TEMP:

#włączać
za pomocą przestrzeni nazw Std;
int main (int argc, char ** argv)

Cout << argv[0] << ", " << argv[1] <<
"," << argv[2] << ", " << argv[3] <<
"," << argv[4] << ", " << argv[5] << endl;
powrót 0;

Zwróć uwagę, że tablica „char*argv [argc]” została ogłoszona jako „char ** argv”.

Jeśli ten program jest uruchamiany z poleceniem terminalu,

./Temp Artykuły 3 Pióro książki „Big House”

Wtedy wyjście byłoby:

./Temp, artykuły, 3, książka, długopis, duży dom

Zauważ, że ścieżka katalogu została zawarta z nazwą pliku wykonywalnego.

Należy również zauważyć, że podczas uruchamiania programu (wywoływania programu) wartość ARGC nie została wysłana.

Wniosek

Klasa iostream ma cztery ważne obiekty, które to Cout, CIN, CERR i CLOG. CIN jest obiektem wejściowym, a reszta to obiekty wyjściowe. Podczas uruchamiania programu wejście do programu różni się od tego, kiedy program ma zacząć działać. Kiedy program zaczyna się uruchomić, wprowadzenie do programu jest połączone z poleceniem, aby uruchomić program, oddzielony przestrzeniami.