Dowiedz się o danych wejściowych i wyjściowych w C++
01 z 08Nowy sposób na wyjście
Analizator_ruchu/Getty Images
C++ zachowuje bardzo wysoką kompatybilność wsteczną z C, więc można go dołączyć, aby zapewnić dostęp do printf() funkcja wyjścia. Jednak operacje we/wy dostarczane przez C++ są znacznie wydajniejsze i, co ważniejsze, bezpieczne dla typów. Nadal możesz również użyć scanf() dla danych wejściowych, ale funkcje bezpieczeństwa typów, które zapewnia C++, oznaczają, że aplikacje będą bardziej niezawodne, jeśli użyjesz C++.
W poprzedniej lekcji poruszono to na przykładzie użycia cout. Tutaj zajmiemy się nieco głębiej, zaczynając od danych wyjściowych, ponieważ są one częściej używane niż dane wejściowe.
Klasa iostream zapewnia dostęp do obiektów i metod potrzebnych zarówno dla danych wyjściowych, jak i wejściowych. Pomyśl o we/wy w kategoriach strumieni bajtów – przechodzących z aplikacji do pliku, ekranu lub drukarki – to wyjście, lub z klawiatury – to jest wejście.
Wyjście z Cout
Jeśli znasz C, możesz to wiedzieć << służy do przesuwania bitów w lewo. Np. 3<< 3 is 24. Eg left shift doubles the value so 3 left shifts multiplies it by 8.
w C++, << był przeciążony w klasie ostream, aby int , platforma , oraz typy stringów (i ich warianty- np. debel ) są obsługiwane. W ten sposób wyprowadzasz tekst, łącząc ze sobą wiele elementów między<<.
|_+_|Ta osobliwa składnia jest możliwa, ponieważ każdy z << jest w rzeczywistości wywołaniem funkcji, która zwraca a odniesienie do strumienia obiekt . Tak więc linia taka jak powyżej jest w rzeczywistości taka
|_+_|C funkcjonować printf był w stanie sformatować dane wyjściowe za pomocą Specyfikatorów formatu, takich jak %d. W C++ cout może również formatować wyjście, ale robi to w inny sposób.
02 z 08Używanie Cout do formatowania danych wyjściowych
Cout obiektu jest członkiem jostream biblioteka. Pamiętaj, że musi to być dołączone do
|_+_|
Ta biblioteka jostream pochodzi od nasz wróg (dla wyjścia) i strumień do wprowadzania danych.
Formatowanie wyjścia tekstowego odbywa się poprzez wstawienie manipulatorów do strumienia wyjściowego.
Co to jest manipulator?
Jest to funkcja, która może zmienić charakterystykę strumienia wyjściowego (i wejściowego). Na poprzedniej stronie widzieliśmy, że << była przeładowaną funkcją, która zwróciła referencję do obiektu wywołującego, np. cout dla wyjścia lub cin dla wejścia. Robią to wszystkie manipulatory, dzięki czemu można je uwzględnić w danych wyjściowych << lub wejście >> . Przyjrzymy się wprowadzaniu i >> w dalszej części tej lekcji.
|_+_|koniec to manipulator, który kończy linię (i rozpoczyna nową). Jest to funkcja, którą można wywołać również w ten sposób.
|_+_|
Chociaż w praktyce byś tego nie zrobił. Używasz go w ten sposób.
|_+_|Pliki to tylko strumienie
Coś, o czym należy pamiętać, że w dzisiejszych czasach wiele prac jest tworzonych w GUI aplikacje, dlaczego potrzebujesz funkcji wejścia/wyjścia tekstu? Czy to nie tylko dla? konsola Aplikacje? Cóż, prawdopodobnie wykonasz operacje wejścia/wyjścia plików i możesz ich tam również użyć, ale również to, co jest wyprowadzane na ekran, zwykle również wymaga formatowania. Strumienie są bardzo elastycznym sposobem obsługi danych wejściowych i wyjściowych i mogą współpracować z
- We/wy tekstu. Jak w aplikacjach konsolowych.
- Smyczki. Przydatny do formatowania.
- Plik we/wy.
Manipulatory ponownie
Chociaż używamy nasz wróg klasa, to jest Klasy pochodnej od ios klasa, która pochodzi od ios_base . Ta klasa przodków definiuje publiczność Funkcje które są manipulatorami.
03 z 08Lista manipulatorów Cout
Manipulatory można zdefiniować w strumieniach wejściowych lub wyjściowych. Są to obiekty, które zwracają referencję do obiektu i są umieszczane między parami << . Większość manipulatorów jest zadeklarowana w: , ale koniec , kończy się oraz spłukać pochodzić z . Kilka manipulatorów przyjmuje jeden parametr, a te pochodzą z .
Oto bardziej szczegółowa lista.
Z
- endl - Kończy linię i dzwoni równo.
- kończy się — wstawia ' ' ( ZERO ) do strumienia.
- flush — Wymuś natychmiastowe wyprowadzenie bufora.
Z . Większość jest zadeklarowana w przodku . Pogrupowałem je według funkcji, a nie alfabetycznie.
- boolalpha — wstawiaj lub wyodrębniaj obiekty logiczne jako „prawda” lub „fałsz”.
- noboolalpha — Wstawiaj lub wyodrębniaj obiekty logiczne jako wartości liczbowe.
- fixed - Wstaw wartości zmiennoprzecinkowe w stałym formacie.
- Scientific — wstawiaj wartości zmiennoprzecinkowe w formacie naukowym.
- wewnętrzne - Wyrównaj wewnętrzne.
- left - Wyrównaj do lewej.
- right - Right-justify.
- dec - Wstaw lub wyodrębnij wartości całkowite w formacie dziesiętnym.
- hex — Wstaw lub wyodrębnij wartości całkowite w formacie szesnastkowym (o podstawie 16).
- oct - Wstaw lub wyodrębnij wartości w formacie ósemkowym (podstawa 8).
- noshowbase — Nie poprzedzaj wartości jej podstawą.
- showbase - Wartość prefiksu z jego podstawą.
- noshowpoint - Nie pokazuj kropki dziesiętnej, jeśli nie jest to konieczne.
- showpoint - Zawsze pokazuj kropkę dziesiętną podczas wstawiania wartości zmiennoprzecinkowych.
- noshowpos - Nie wstawiaj znaku plus (+), jeśli liczba >= 0.
- showpos - Wstaw znak plus (+), jeśli liczba >=0.
- noskipws - Nie pomijaj początkowego odstępu przy wyodrębnianiu.
- skipws — pomija początkowe białe znaki podczas wyodrębniania.
- nouppercase — nie zastępuj małych liter odpowiednikami wielkich liter.
- uppercase - Zastąp małe litery odpowiednikami wielkich liter.
- unitbuf - Opróżnia bufor po wstawieniu.
- nounitbuf - Nie opróżniaj bufora po każdym wstawieniu.
Przykłady użycia Cout
|_+_|Wynik tego jest poniżej, z jednym lub dwoma dodatkowymi odstępami linii usuniętymi dla jasności.
|_+_|Notatka : Pomimo wielkich liter, David jest drukowany jako David, a nie DAVID. Dzieje się tak, ponieważ wielkie litery mają wpływ tylko na wygenerowane dane wyjściowe, np. liczby drukowane wszesnastkowy. Tak więc wyjście szesnastkowe 4d2 to 4D2, gdy działają wielkie litery.
Ponadto większość z tych manipulatorów faktycznie ustawia bit we fladze i można to ustawić bezpośrednio za pomocą
|_+_|i wyczyść to za pomocą
|_+_| 05 z 08Używanie Setf i Unsetf do manipulowania formatowaniem I/O
Funkcja setf ma dwa przeciążony wersje pokazane poniżej. Podczas gdy unsetf po prostu czyści określone bity.
|_+_|Flagi zmiennych są wyprowadzane przez ORing razem wszystkie części, które chcesz z |. Więc jeśli chcesz naukowe, wielkie i boolalpha następnie użyj tego. Tylko bity przeszły jako parametr są ustawione. Pozostałe bity pozostają niezmienione.
|_+_|Produkuje
|_+_|Bity maskujące
Dwójka parametr wersja setf używa maski. Jeśli bit jest ustawiony zarówno w pierwszym, jak i drugim parametrze, zostanie ustawiony. Jeśli bit znajduje się tylko w drugim parametrze, jest usuwany. Wartości pole korekty, pole bazowe oraz pływak (wymienione poniżej) są flagami złożonymi, czyli kilkoma flagami Or'd razem. Do pole bazowe z wartościami 0x0e00 jest taki sam jak gru | paź | klątwa . Więc
|_+_|usuwa wszystkie trzy flagi, a następnie ustawia klątwa . podobnie pole regulacji jest lewo | prawo | wewnętrzny oraz pływak jest naukowe | naprawił .
Lista bitów
Ta lista wyliczeń pochodzi z Microsoft Visual C++ 6.0. Faktycznie używane wartości są dowolne — inny kompilator może używać innych wartości.
|_+_| 06 z 08O Clogu i Cerr
Tak jak Cout , zatkać oraz zły to predefiniowane obiekty zdefiniowane w ostream. Klasa iostream dziedziczy z obu nasz wróg oraz strumień więc dlatego Cout przykłady można użyć jostream .
Buforowane i niebuforowane
- Buforowane — wszystkie dane wyjściowe są tymczasowo przechowywane w a bufor a następnie zrzucane na ekran za jednym razem. Zbuforowane są zarówno cout, jak i clog.
- Niebuforowane — wszystkie dane wyjściowe trafiają natychmiast do urządzenia wyjściowego. Przykładem obiektu niebuforowanego jest cerr.
Poniższy przykład pokazuje, że cerr jest używany w taki sam sposób jak cout.
|_+_|Główny problem z buforowaniem polega na tym, że program ulega awarii, a następnie zawartość bufora jest tracona i trudniej jest zrozumieć, dlaczego się zawiesił. Niebuforowane wyjście jest natychmiastowe, więc dodanie kilku takich linijek do kodu może się przydać.
|_+_|Problem z logowaniem
Budowanie dziennika zdarzeń programu może być użytecznym sposobem na wykrycie trudnych błędów – typu, które pojawiają się tylko od czasu do czasu. Jeśli jednak to zdarzenie jest awarią, masz problem — czy po każdym wywołaniu usuwasz dziennik na dysk, aby móc zobaczyć zdarzenia aż do awarii, czy też przechowujesz je w buforze i okresowo opróżniasz bufor z nadzieją, że tego nie zrobisz stracić zbyt dużo, gdy nastąpi awaria?
07 z 08Używanie Cin do wprowadzania danych: sformatowane wprowadzanie
Istnieją dwa rodzaje danych wejściowych.
- Sformatowany. Odczytywanie danych wejściowych jako liczb lub określonego typu.
- Niesformatowany. Odczytywanie bajtów lub smyczki . Daje to znacznie większą kontrolę nad strumieniem wejściowym.
Oto prosty przykład sformatowanego wejścia.
|_+_|Używa cin do odczytania trzech liczb ( int , platforma ,int) oddzielone spacjami. Po wpisaniu numeru musisz nacisnąć Enter.
3 7.2 3 wyświetli 'Wprowadziłeś 3 7.2 3'.
Sformatowane wejście ma ograniczenia!
Jeśli wpiszesz 3,76 5 8, otrzymasz „Wpisałeś 3 0,76 5”, wszystkie inne wartości w tym wierszu zostaną utracone. To zachowuje się poprawnie, jak . nie jest częścią int i oznacza początek pływaka.
Wyłapywanie błędów
Obiekt cin ustawia bit błędu, jeśli dane wejściowe nie zostały pomyślnie przekonwertowane. Ten kawałek jest częścią ios i można je odczytać za pomocą ponieść porażkę() funkcja na obu jedzenie oraz Cout lubię to.
|_+_|Nie jest zaskoczeniem, cout.fail() rzadko jest ustawiana, przynajmniej na wyjściu ekranu. W późniejszej lekcji o plikach I/O zobaczymy jak cout.fail() może stać się prawdą. Istnieje również Dobry() funkcja dla jedzenie , Cout itp.
08 z 08Wychwytywanie błędów w sformatowanych danych wejściowych
Oto przykład pętli wejściowej do momentu prawidłowego wprowadzenia liczby zmiennoprzecinkowej.
|_+_| jasne() ignorowaćNotatka : Wejście takie jak 654.56Y odczyta całą drogę do Y, wyodrębni 654.56 i wyjdzie z pętli. Jest uważane za prawidłowe dane wejściowe przez jedzenie
Niesformatowane wejście
We/WyWejście z klawiatury
jedzenie Wchodzić ZwrócićTo kończy lekcję.