01
z 08
Nowy sposób na wyjście

C ++ zachowuje bardzo wysoką kompatybilność wsteczną z C, więc
W poprzedniej lekcji poruszono ten przykład na przykładzie cout. Tutaj przejdziemy do nieco większej głębi, zaczynając od wyjścia, ponieważ zwykle jest ono częściej używane niż wejście.
Klasa iostream zapewnia dostęp do obiektów i metod potrzebnych zarówno do danych wyjściowych, jak i wejściowych. Pomyśl o we / wy w kategoriach strumieni bajtów - albo z aplikacji do pliku, ekranu lub drukarki - która jest wyprowadzana, lub z klawiatury - która jest wprowadzana.
Wyjście z Cout
Jeśli znasz C, możesz to wiedzieć << służy do przesuwania bitów w lewo. Np. 3 << 3 to 24. Np. Przesunięcie w lewo podwaja wartość, więc 3 przesunięcia w lewo mnożą ją przez 8.
W C ++ << był przeciążony w klasie ostream, więc int, pływaki typy ciągów (i ich warianty - np debel) są obsługiwane. W ten sposób generujesz tekst, łącząc wiele elementów między <<.>
cout << „Some Text” << intvalue << floatdouble << endl;
Ta osobliwa składnia jest możliwa, ponieważ każdy z nich << jest w rzeczywistości wywołaniem funkcji, które zwraca a odniesienie ostream obiekt. Tak więc linia taka jak powyżej jest w rzeczywistości taka
cout. << („trochę tekstu”). cout. << (wartość) .cout. << (floatdouble) .cout. << (endl);
C. funkcjonowaćprintf był w stanie sformatować dane wyjściowe przy użyciu specyfikatorów formatu, takich jak% d. W C ++ cout może również formatować dane wyjściowe, ale używa innego sposobu.
02
z 08
Używanie Cout do formatowania wyjścia
Obiekt cout jest członkiem iostream biblioteka. Pamiętaj, że to musi być dołączone do
#zawierać
Ta biblioteka iostream pochodzi z ostream (dla danych wyjściowych) i istream na wejście.
Formatowanie tekstu wyjściowego odbywa się poprzez wstawienie manipulatorów do strumienia wyjściowego.
Co to jest manipulator?
Jest to funkcja, która może zmieniać właściwości strumienia wyjściowego (i wejściowego). Na poprzedniej stronie to widzieliśmy << była przeciążona funkcja, która zwróciła odwołanie do obiektu wywołującego np. cout dla wyjścia lub cin dla wejścia. Wszystkie manipulatory to robią, aby można je było dołączyć do wyniku << lub wejście >>. Przyjrzymy się wejściom i >> później w tej lekcji.
count << endl;
endl to manipulator, który kończy linię (i rozpoczyna nową). Jest to funkcja, którą można również wywołać w ten sposób.
endl (cout);
Chociaż w praktyce nie zrobiłbyś tego. Używasz go w ten sposób.
cout << „Some Text” << endl << endl; // Dwie puste linie.
Pliki to tylko strumienie
Należy mieć na uwadze, że przy dużym postępie w tych dniach GUI aplikacje, dlaczego potrzebujesz funkcji tekstowych we / wy? Czy to nie tylko konsola Aplikacje? Prawdopodobnie zrobisz plikowe operacje wejścia / wyjścia i możesz ich tam również użyć, ale również to, co jest wyświetlane na ekranie, zwykle wymaga formatowania. Strumienie są bardzo elastycznym sposobem obsługi danych wejściowych i wyjściowych i mogą z nimi współpracować
- Text I / O. Jak w aplikacjach konsolowych.
- Smyczki. Przydatny do formatowania.
- Plik I / O.
Manipulatory Znowu
Chociaż korzystaliśmy z ostream klasa, to jest Klasy pochodnej z ios klasa wywodząca się z ios_base. Ta klasa przodków określa społeczeństwo Funkcje które są manipulatorami.
03
z 08
Lista manipulatorów Cout
Manipulatory można definiować w strumieniach wejściowych lub wyjściowych. Są to obiekty, które zwracają odniesienie do obiektu i są umieszczane między parami <<. Większość manipulatorów zadeklarowano w, ale endl, kończy się i spłukać pochodzić z
Oto bardziej szczegółowa lista.
Od
- endl - Kończy linię i wywołuje kolor.
- ends - Wstawia „\ 0” ( ZERO) do strumienia.
- flush - Wymusza natychmiastowe wyjście bufora.
Od . Większość jest zadeklarowana w
- boolalpha - Wstaw lub wyodrębnij obiekty bool jako „prawda” lub „fałsz”.
- noboolalpha - Wstaw lub wyodrębnij obiekty bool jako wartości liczbowe.
- fixed - Wstaw wartości zmiennoprzecinkowe w ustalonym formacie.
- naukowe - Wstaw wartości zmiennoprzecinkowe w formacie naukowym.
- wewnętrzna - uzasadnienie wewnętrzne.
- left - justowanie w lewo.
- prawo - słuszne uzasadnienie.
- 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 (podstawa 16).
- oct - Wstaw lub wyodrębnij wartości w formacie ósemkowym (podstawa 8).
- noshowbase - Nie należy poprzedzać wartości wartością podstawy.
- showbase - Wartość prefiksu z jego podstawą.
- noshowpoint - Nie pokazuj przecinka dziesiętnego, jeśli nie jest to konieczne.
- showpoint - Zawsze pokazuj przecinek dziesiętny 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ątkowej białej spacji podczas wypakowywania.
- skipws - Pomija początkową białą spację podczas wypakowywania.
- nouppercase - Nie zastępuj małych liter odpowiednikami wielkich liter.
- wielkie litery - Zastąp małe litery odpowiednikami wielkich liter.
- unitbuf - Opróżnij bufor po wstawieniu.
- nounitbuf - Nie opróżniaj bufora po każdej wstawce.
04
z 08
Przykłady użycia Cout
// ex2_2cpp. #include „stdafx.h” #zawieraćusing namespace std; int main (int argc, char * argv []) { cout.width (10); cout << prawo << „Test” << endl; cout << w lewo << „Test 2” << endl; cout << wewnętrzny << „Test 3” << endl; cout << endl; cout.precision (2); cout << 45,678 << endl; cout << wielkie litery << „David” << endl; cout.precision (8); cout << naukowe << endl; cout << 450678762345.123 << endl; cout << naprawiono << endl; cout << 450678762345.123 << endl; cout << showbase << endl; cout << showpos << endl; cout << hex << endl; cout << 1234 << endl; cout << oct << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; cout << noshowbase << endl; cout << noshowpos << endl; cout.unsetf (ios:: wielkie litery); cout << hex << endl; cout << 1234 << endl; cout << oct << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; zwraca 0; }
Wyjście z tego jest poniżej, z jednym lub dwoma dodatkowymi odstępami linii usuniętymi dla przejrzystości.
Test. Test 2. Test 3. 46. David. 4.50678762E + 011. 450678762345.12299000. 0X4D2. 02322. +1234. 4d2. 2322. 1234.
Uwaga: Pomimo wielkiej litery David jest drukowany jako David, a nie DAVID. Wynika to z faktu, że wielkie litery wpływają tylko na generowane dane wyjściowe - np. numery wydrukowane w szesnastkowy. Zatem wyjście szesnastkowe 4d2 ma wartość 4D2, gdy działa duża litera.
Ponadto większość z tych manipulatorów faktycznie ustawia nieco flagę i można to ustawić bezpośrednio za pomocą
cout.setf ()
i wyczyść to za pomocą
cout.unsetf ()
05
z 08
Używanie Setf i Unsetf do manipulowania formatowaniem I / O
Funkcja setf ma dwa przeciążony wersje pokazane poniżej. Podczas unsetf po prostu usuwa określone bity.
setf (wartości flagowe); setf (wartości flagowe, wartości maskowe); unsetf (wartości flagowe);
Flagi zmiennych pochodzą od ORing razem wszystkie potrzebne bity |. Więc jeśli chcesz naukowy, wielkie litery i boolalpha następnie użyj tego. Tylko bity przekazywane jako parametr są ustawione. Pozostałe bity pozostają niezmienione.
cout.setf (ios_base:: naukowy | ios_base:: wielkie litery | ios_base:: boolalpha); cout << hex << endl; cout << 1234 << endl; cout << dec << endl; cout << 123400003744.98765 << endl; wartość bool = true; cout << wartość << endl; cout.unsetf (ios_base:: boolalpha); cout << wartość << endl;
Produkuje
4D2. 1,234000E + 011. prawdziwe. 1.
Bity maskujące
Dwójka parametr wersja setf używa maski. Jeśli bit jest ustawiony zarówno w pierwszym, jak i drugim parametrze, zostaje ustawiony. Jeśli bit znajduje się tylko w drugim parametrze, jest kasowany. Wartości Adjustfield, Basefield i floatfield (wymienione poniżej) to flagi złożone, czyli kilka flag Lub razem. Dla pole podstawowe z wartościami 0x0e00 jest taki sam jak dec | oct | klątwa. Więc
setf (ios_base:: hex, ios_basefield);
usuwa wszystkie trzy flagi, a następnie ustawia klątwa. podobnie Dostosuj pole jest lewo | prawo | wewnętrzny i floatfield jest naukowe | naprawiony.
Lista bitów
Ta lista wyliczeń pochodzi z Microsoft Visual C ++ 6.0. Rzeczywiste użyte wartości są dowolne - inny kompilator może używać różnych wartości.
skipws = 0x0001. unitbuf = 0x0002. wielkie litery = 0x0004. showbase = 0x0008. showpoint = 0x0010. showpos = 0x0020. po lewej = 0x0040. prawo = 0x0080. wewnętrzny = 0x0100. dec = 0x0200. oct = 0x0400. hex = 0x0800. naukowe = 0x1000. naprawiono = 0x2000. boolalpha = 0x4000. Adjustfield = 0x01c0. basefield = 0x0e00, floatfield = 0x3000. _Fmtmask = 0x7fff, _Fmtzero = 0.
06
z 08
O Clog i Cerr
Lubić cout, zatkać i Cerr są predefiniowanymi obiektami zdefiniowanymi w ostream. Klasa iostream dziedziczy po obu ostream i istream dlatego właśnie cout przykłady można wykorzystać iostream.
Buforowane i niebuforowane
- Buforowane - wszystkie dane wyjściowe są tymczasowo przechowywane w pliku bufor a następnie zrzucony do ekranu za jednym razem. Zarówno cout, jak i chodak są buforowane.
- Niebuforowane - wszystkie dane wyjściowe trafiają natychmiast do urządzenia wyjściowego. Przykładem niebuforowanego obiektu jest cerr.
Poniższy przykład pokazuje, że cerr jest używany w taki sam sposób jak cout.
#zawierać using namespace std; int _tmain (int argc, _TCHAR * argv []) {cerr.width (15); por. prawo; cerr << „Błąd” << endl; zwraca 0; }
Głównym problemem z buforowaniem jest to, czy program ulega awarii, a następnie zawartość bufora jest tracona i trudniej jest zrozumieć, dlaczego się zawiesił. Niebuforowane wyjście jest natychmiastowe, więc przydanie się kilku takich wierszy w kodzie może się przydać.
cerr << „Wprowadzanie funkcji niebezpiecznej zappit” << endl;
Problem z logowaniem
Budowanie dziennika zdarzeń programu może być użytecznym sposobem na wykrycie trudnych błędów - takich, które występują tylko od czasu do czasu. Jeśli to zdarzenie jest awarią, masz problem - czy opróżniasz dziennik na dysk po każdym wywołaniu, aby zobaczyć zdarzenia aż do awarii lub trzymaj ją w buforze i okresowo opróżniaj bufor, mając nadzieję, że nie stracisz zbyt wiele podczas awarii występuje?
07
z 08
Korzystanie z Cin jako wejścia: sformatowane wejście
Istnieją dwa rodzaje danych wejściowych.
- Sformatowany. Odczytywanie danych wejściowych jako liczb lub określonego typu.
- Niesformatowany. Czytanie bajtów lub smyczki. Daje to znacznie większą kontrolę nad strumieniem wejściowym.
Oto prosty przykład sformatowanego wejścia.
// excin_1.cpp: Definiuje punkt wejścia dla aplikacji konsoli. #include „stdafx.h” // Tylko Microsoft. #zawierać using namespace std; int main (int argc, char * argv []) { int a = 0; pływak b = 0,0; int c = 0; cout << „Wprowadź liczbę całkowitą, zmiennoprzecinkową i liczbę całkowitą oddzielone spacjami” <> a >> b >> c; cout << „Wpisałeś” << a << ”„ << b << ”„ << c << endl; zwraca 0; }
To używa cin do odczytania trzech liczb (int, pływak, int) oddzielone spacjami. Po wpisaniu numeru naciśnij klawisz Enter.
3 7.2 3 wyświetli „Wpisał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 działa poprawnie, jak. nie jest częścią int i oznacza początek pływaka.
Błąd pułapki
Obiekt cin ustawia bit błędu, jeśli dane wejściowe nie zostały pomyślnie przekonwertowane. Ten bit jest częścią ios i można je odczytać za pomocą zawieść() działają na obu zdj i cout lubię to.
if (cin.fail ()) // zrób coś.
Nie jest zaskoczeniem, cout.fail () jest rzadko ustawiany, przynajmniej na ekranie. W późniejszej lekcji na temat pliku we / wy zobaczymy, jak to zrobić cout.fail () może stać się prawdą. Istnieje również dobry() funkcja dla zdj, cout itp.