C++

Zarządzanie konsolą za pomocą klas iostream w C++

Zarządzanie konsolą za pomocą klas iostream w C++

W informatyce konsola to klawiatura komputera i monitor komputera computer. W przeszłości dane wyjściowe były wysyłane bezpośrednio na ekran monitora, a nie do okna wyświetlanego na monitorze. Dla zwykłego użytkownika komputera dzisiejsze aplikacje nie używają monitora wprost. Te aplikacje używają okien 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 udostępnia okno symulujące ekran monitora. W systemie operacyjnym Windows to okno nazywa się Wiersz polecenia Command. 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 odczytywać znaki i ciągi z klawiatury oraz wysyłać znaki i ciągi do terminala (lub wiersza poleceń). Każdy programista C++ musi wiedzieć w tym artykule.

Aby mieć wejście z klawiatury i wyjście do terminala, program musi zaczynać się od:

#zawierać
przy użyciu standardowej przestrzeni nazw;

Treść artykułu

  • Obiekty wąskiego strumienia standardowego iostream
  • Uzyskiwanie 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 za programem C++
  • Wniosek

Obiekty wąskiego strumienia standardowego iostream

Klasa iostream, obiekty standardowe, cout, cin, cerr i clog zostały utworzone i znajdują się już w standardowej bibliotece. Programista po prostu ich używa bez ponownego ich tworzenia instant.

Cout

Poniższa instrukcja w funkcji main() wysyła tekst „To jest wyjście.” do terminala:

Cout << "This is output.";

cout jest wyjściowym obiektem iostream w standardowej bibliotece, już skonkretyzowanym. << 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.

W przypadku powyższej instrukcji ponownie wyświetlony wiersz polecenia pojawia się po prawej stronie frazy wyjściowej. Nie przechodzi do następnej linii. „endl” na końcu poniższej instrukcji wymusi to, co zostanie wydrukowane przez ekran, do następnej linii:

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

„endl” to predefiniowana zmienna. Zawartość ekranu można również przesunąć do następnej linii za pomocą:

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

W przypadku użycia '\n' wszystkie wiersze tekstu mogą nadal nie pojawiać się od razu na ekranie. „endl” opróżnia całą linię tekstu na ekran.

Uwaga: ciąg wysyłany do cout jest w podwójnych cudzysłowach, podczas gdy wysyłany znak jest w pojedynczych cudzysłowach. W jednym wyciągu można przesłać szereg ciągów i znaków, każdy poprzedzony znakiem << . All that will appear in one line at the output if '\n' is not in the series.

Cin

cin to standardowy obiekt wejściowy iostream, już utworzony i dostępny w standardowej bibliotece. Rozważmy następujący segment kodu w funkcji main():

znak txt[50];
Cout << "Enter a word and press Enter:" <> tekst;
Cout << txt << endl;

Pierwsza instrukcja deklaruje pustą tablicę 50 znaków. Druga instrukcja nakazuje użytkownikowi wpisać słowo w następnej linii ekranu i nacisnąć klawisz Enter Enter. Zwróć uwagę na użycie „endl”, które zmusza użytkownika do wpisania tekstu w następnym wierszu ekranu. Gdy użytkownik wpisuje tekst, wprowadzony tekst jest wyświetlany na ekranie, gdy przechodzi do obiektu cin. Po naciśnięciu klawisza Enter wykonywana jest trzecia instrukcja w segmencie kodu. Ta trzecia instrukcja wysyła wprowadzony tekst do zmiennej txt. W tym przypadku wpisany tekst nie powinien być dłuższy niż 50 znaków. Zwróć uwagę na użycie operatora ekstrakcji, >>. Ostatnie stwierdzenie wyświetla wpisany tekst na ekranie.

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

znak txt[20];
w to;
pływak ft;
Cout << "Enter 3 values and press Enter:" <> txt >> to >> ft;
Cout << txt << " << it << " << ft << endl;

Zwróć uwagę na oświadczenie:

cin >> txt >> it >> ft;

Pierwsze słowo jest wyodrębniane do txt, następne do niego, a ostatnie do ft. Jeśli dane wejściowe były,

jeden 25 3.6

wtedy wynik segmentu kodu będzie,

jeden 25 3.6

zły

Następujący program ma błąd:

#zawierać
przy użyciu standardowej przestrzeni nazw;
int main()

w moim Int;
zwróć 0;

Pierwsza instrukcja w main() nie jest poprawna. Jeśli nazwa pliku z kodem to „temp.cc”, a wynikowy plik wykonywalny ma nazywać się „temp”, następnie następująca komenda g++ wyśle ​​do pliku komunikat o błędzie kompilatora „błąd.tekst":

g++ -o temp.cc 2>błąd.tekst

Jeśli plik „błąd”.txt” nie istnieje, zostałby utworzony. Zwróć uwagę na część „2> błąd.txt” polecenia g++.

Ekran jest standardowym miejscem docelowym wyjścia, a także standardowym miejscem docelowym błędu. Jeśli „2> błąd.txt” jest pomijany w poleceniu g++, wtedy komunikat o błędzie kompilatora zostanie wysłany do standardowego miejsca docelowego błędu, którym nadal jest ekran (monitor).

Obiekt stream, który reprezentuje standardowe miejsce docelowe wyjścia, to cout. Obiekt stream, który reprezentuje standardowe miejsce docelowe błędu, to cerr. Błąd wykonania programu można wysłać na ekran w następujący sposób:

zły << "The error message!" << '\n';

zatkać

Aplikacja pobiera różne dane wejściowe w różnym czasie. Wszystkie dane wejściowe można ponownie wyświetlić na ekranie. Wszystkie dane wejściowe można zapisać w pliku. To jest logowanie. Standardowym miejscem logowania jest ekran. Standardowym obiektem strumienia rejestrowania jest zatkanie. Poniższy kod ponownie wyświetli tekst wejściowy na ekranie:

znak txt[50];
Cout<<"Enter text and press Enter:"<>tekst;
zatkać<Jeśli tekst wejściowy to "tekst_wejściowy", wtedy zatkanie ponownie wyświetli "tekst_wejściowy" na ekranie.

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

#zawierać
przy użyciu standardowej przestrzeni nazw;
int main()

freopen( "log.txt", "w", standardowe wyjście);
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 utworzony. Drugim argumentem jest „w” dla „zapisu”. Jego trzecim argumentem jest standardowe wyjście dla standardowego wyjścia. Druga instrukcja w funkcji main() używa cout do wysłania tekstu logowania do pliku. Uwaga: rzeczywisty kod wejściowy nie został pokazany w tym programie.

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

Podczas gdy użytkownik wpisuje dane wejściowe, znaki są wysyłane do bufora strumienia wejściowego i wyświetlane na ekranie. Gdy użytkownik naciśnie klawisz Enter, wszystkie znaki znajdują się w buforze; również kursor przechodzi na początek następnej linii poniżej, na ekranie. Następnie program przechodzi do następnej instrukcji programu, po instrukcji odczytu wejścia.

Obiekt cin posiada metody, których dotyczy ta sekcja.

Czytanie pierwszego znaku

pobierz(typ_znaku&c):
Poniższy segment kodu pokazuje, jak odczytać pierwszy znak z bufora strumienia wejściowego:

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

Pierwsza instrukcja deklaruje znak bez przypisania. Druga instrukcja mówi użytkownikowi, aby wpisał znak. Gdy użytkownik wpisze znak i naciśnie klawisz Enter, trzecia instrukcja kopiuje znak z bufora strumienia wejściowego do zmiennej ch.

Nawet jeśli użytkownik wpisze więcej niż jeden znak, pierwszy znak zostanie przejęty przez segment kodu.

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

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

Jeśli dane wejściowe to „asdfg”, zostanie zwrócone 97, co jest dziesiętnym kodem ASCII dla „a”.

get(char_type* s, streamsize n)

Po tym, jak użytkownik wprowadzi frazę i naciśnie klawisz Enter, z bufora strumienia cin można wyodrębnić kilka znaków od pierwszego. Można użyć następującego kodu:

znak str[10];
Cout << "Input text:" << endl;
Cin.pobierz(str, 10);
Cout << str << endl;

Jeśli dane wejściowe to „świetni ludzie”, to wyjściem będzie „świetni ludzie”, z 9 znakami, a nie 10. Znak NUL ciągu (\0) zajmuje dziesiątą pozycję w argumencie get get. Tak więc, aby mieć 9 znaków w str, jego rozmiar pamięci musi wynosić co najmniej 10, a argument get() musi wynosić 11. Jeśli pożądana jest cała linia wejściowa, to numer pamięci ciągu musi być co najmniej liczbą wpisanych znaków plus 1. Tak więc, jeśli wpisano 12 znaków dla całej linii, liczba powinna wynosić 13 dla rozmiaru pamięci łańcucha (str) i 13 dla argumentu get(). Pamiętaj, że jedna spacja jest liczona jako jeden znak.

get(char_type* s, streamsize n, char_type delim)
Możliwe jest wyodrębnienie podciągu, oddzielonego po prawej stronie, według pierwszego wystąpienia określonego znaku lub według rozmiaru strumienia podciągu, którykolwiek wystąpi pierwszy. Jeśli tekst wejściowy do poniższego kodu to „świetni ludzie”, to zostanie wyodrębnione „świetni”:

znak [30];
Cout << "Input text:" << endl;
Cin.pobierz(str, 6, 'o');
Cout << str << endl;

Szósta pozycja od początku to znak spacji i ogranicza ona wyłącznie wyodrębniony podciąg. Szósta pozycja jest pierwsza przed jedynym znakiem „o”. Pamiętaj, że rozmiar pamięci dla str może być tak wysoki, jak to możliwe.

Jeśli tekst wejściowy do poniższego kodu to „świetni ludzie”, to zostanie wyodrębnione „gr”:

znak [30];
Cout << "Input text:" << endl;
Cin.pobierz(str, 10, 'e');
Cout << str << endl;

Pierwsze wystąpienie „e” pojawia się przed dziesiątą pozycją.

Uzyskanie wszystkich znaków linii

Po naciśnięciu klawisza Enter wszystkie znaki wpisane do linii można uzyskać, jak pokazano w poniższym kodzie:

Cout << "Input text:" << endl;
podczas gdy (1)
char ch = (char)cin.otrzymać();
Cout << ch;
if (ch == '\n')
złamać;

Rzutowanie za pomocą (char), konwertuje każdą liczbę dziesiętną na odpowiedni znak ASCII.

zerkać()

Funkcje składowe get() nie tylko odczytują następny znak; usuwają go z bufora strumienia. Jednak funkcja członkowska peek() simple odczytuje następny znak (poczynając od pierwszego) bez usuwania go z bufora. W poniższym kodzie każdy znak jest najpierw odczytywany za pomocą funkcji peek(), zanim zostanie usunięty, przez funkcję get(). Wszystko, co dzieje się po naciśnięciu przez użytkownika klawisza Enter:

Cout << "Input text:" << endl;
podczas gdy (1)
char ch = (char)cin.zerkać();
Cout << ch;
Cin.otrzymać();
if (ch == '\n')
złamać;

Gdyby następne znaki nie zostały usunięte przez get(), peek() odczytałoby tylko pierwszy znak, a pętla będzie iterować w nieskończoność.

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

Zauważ, że w przypadku obiektu cin należy nacisnąć klawisz Enter, zanim nastąpi akcja. Cóż, możliwe jest, aby znaki były wyświetlane podczas wpisywania i usuwane przed naciśnięciem klawisza Enter. Oznacza to jednak połączenie z systemem operacyjnym. Systemy operacyjne różnią się. Oznacza to więc różne kodowanie dla różnych systemów operacyjnych. Więc ten temat zasługuje na zupełnie inny tutorial - zobacz dalej see.

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

Obiekt cout jest obiektem strumienia wyjściowego, który został już utworzony i znajduje się w standardowej bibliotece C++. cout jest głównym obiektem używanym do wysyłania znaków i ciągów znaków do monitora. Odbywa się to za pomocą operatora wstawiania, << . 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, których wynikiem są skalary, mogą być argumentami operatora wstawiania. Operator konwertuje skalar na tekst i umieszcza tekst w strumieniu obiektów cout. Gdy tekst jest wysyłany do obiektu cout, zwykle pojawia się na ekranie (monitor). Czasami jednak może nie pojawić się od razu. Aby wymusić wyświetlanie tekstu na ekranie, wstaw specjalną wartość „endl” zaraz po wstawieniu tekstu. Spowoduje to wyrzucenie tekstu na ekran i dodanie nowej linii. Uwaga: '\n' po prostu dodaje nową linię, ale nie opróżnia tekstu na ekranie.

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

#zawierać
przy użyciu standardowej przestrzeni nazw;
int main()

int to = 5;
pływak ft = 63.5;
Cout << "The " << it << " items cost $" << ft << " US." << endl;
zwróć 0;

Dane wyjściowe to:

5 pozycji kosztuje 63.5 US.

Poniższy program pokazuje, jak wypisywany jest ciąg obiektu utworzonego z klasy:

#zawierać
przy użyciu standardowej przestrzeni nazw;
struktura St
char str[11] = "kilka słów";
obj;
int main()

Cout << obj.str << '\n';
zwróć 0;

Wyjście to „kilka słów”.

Argumenty za programem C++

Wykonywanie programu rozpoczyna się od funkcji main(). Funkcja main() w rzeczywistości ma dwa opcjonalne parametry. Składnia funkcji main() z parametrami opcjonalnymi to:

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

zwróć 0;

Załóżmy, że nazwa pliku wykonywalnego C++ to „temp”. Załóżmy, że argumenty, których program potrzebuje od swojego środowiska (systemu operacyjnego), wpisane przez użytkownika, to:,

artykuły 3 długopis książkowy "duży dom"

Jest tu 5 argumentów: „artykuły”, „3”, „książka”, „długopis” i „duży dom”

Każdy jest tekstem. Numerowanym argumentem programu jest tekst. Innymi słowy, każdy argument jest ciągiem. „duży dom” jest w cudzysłowie, ponieważ jest to wyrażenie. Polecenie terminala do uruchomienia tego programu to:

./temp artykuły 3 długopis książkowy "duży dom"

Zakładając, że plik temp znajduje się w katalogu domowym. Zauważ, że spacje, a nie przecinki oddzielają argumenty argument.

Teraz, w składni funkcji main(), argc to liczba argumentów programu plus 1. W tym przypadku program ma 5 argumentów. A więc argc to 6. W składni argv[argc] jest tablicą wskaźników do łańcuchów. Pierwsza wartość tej tablicy w argv[0] jest podana przez kompilator. Jest to wskaźnik do nazwy pliku programu. Pozostałe wartości są wskaźnikami do argumentów programu w kolejności wpisanego przez użytkownika. Rozmiar tej tablicy to argc. W tym przypadku rozmiar to 1 + 5 = 6.

Załóżmy, że podczas kompilacji następujący program ma nazwę temp:

#zawierać
przy użyciu standardowej przestrzeni nazw;
int main(int argc, char** argv)

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

Zauważ, że tablica "char *argv[argc]" została zadeklarowana jako "char** argv".

Jeśli ten program jest uruchamiany za pomocą polecenia terminala,

./temp artykuły 3 długopis książkowy "duży dom"

wtedy wynik byłby następujący:

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

Zwróć uwagę, że ścieżka do katalogu została dołączona do nazwy pliku wykonywalnego.

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

Wniosek

Klasa iostream ma cztery ważne obiekty: cout, cin, cerr i clog. cin to obiekt wejściowy, a reszta to obiekty wyjściowe output. Gdy program jest uruchomiony, dane wejściowe do programu różnią się od tego, kiedy program ma zacząć działać. Gdy program zaczyna działać, dane wejściowe programu są łączone z poleceniem uruchomienia programu, oddzielone spacjami.

Jak używać Xdotool do stymulacji kliknięć myszą i naciśnięć klawiszy w systemie Linux?
Xdotool to darmowe i otwarte narzędzie wiersza poleceń do symulacji kliknięć myszą i naciśnięć klawiszy. Ten artykuł zawiera krótki przewodnik dotyczą...
5 najlepszych ergonomicznych myszy komputerowych dla systemu Linux
Czy długotrwałe korzystanie z komputera powoduje ból nadgarstka lub palców?? Cierpisz na sztywne stawy i ciągle musisz uścisnąć dłonie? Czy czujesz pa...
Jak zmienić ustawienia myszy i touchpada za pomocą Xinput w systemie Linux?
Większość dystrybucji Linuksa jest domyślnie dostarczana z biblioteką „libinput” do obsługi zdarzeń wejściowych w systemie. Może przetwarzać zdarzenia...