Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: 'world007'
Kurs C++

Obsługa strumienia cout

[lekcja] Dokument opisuje jak sterować wyświetlaniem danych w konsoli strumienia std::cout.

Sterowanie formatem

Bieżące zasady formatowania zapisane są w ośrodku dowodzenia kontrolnego strumienia - w tak zwanych flagach stanu formatowania.
Klasa w której te flagi umieszczono jest nazwana ios.
Flagi dla biblioteki <iostream>.
Zmiany własności flag:
Włączanie flag: obiekt.setf(ios::flaga);
Wyłączanie flag: obiekt.unsetf(ios::flaga);
Wywoływanie funkcji składowych z ios: obiekt.funkcja()

right, left, internal

czyli justowanie tekstu gdy liczba dwucyfrowa ma być wyświetlona na polu o szerokości 10 pól, width() -ustawienie dłogości wyświtlania
C/C++
int l = - 3;
cout << l << endl;
cout.width( 10 );
cout << left << l << endl;
cout.width( 10 );
cout << right << l << endl;
cout.width( 10 );
cout << internal << l << endl;

dec(10), oct(8), hex(16)

zmiany w systemach, stosujemy tutaj ios::basefield  z wygody
C/C++
int l = 59;
cout.setf( ios::hex, ios::basefield );
cout << l << endl; //3b
cout.setf( ios::oct, ios::basefield );
cout << l << endl; //73
cout.setf( ios::dec, ios::basefield );
cout << l << endl; //59

showpos

dodaje + przed liczbami
C/C++
int a = 59;
cout.setf( ios::showpos );
cout << a << endl; //+59

uppercase

w zapisie 16-stkowym powiększa litery
C/C++
int l = 59;
cout.setf( ios::hex, ios::basefield );
cout.setf( ios::uppercase );
cout << l << endl; //3B

showpoint

wypisuje nawet nieznaczące zera i kropkę dziesiętną
C/C++
float x = 1175;
cout << x << endl; //1175
cout.setf( ios::showpoint );
cout << x << endl; //1175.00

scientific

notacja naukowa czyli wykładnicza
C/C++
float x = 1175;
cout << x << endl; //1175
cout.setf( ios::scientific );
cout << x << endl; //1.175000e+003

fixed

notacja zwykła (w odwrotną stronę niż w przykładzie powyżej)

width()

określa na ilu polach wypisać liczbą, przydatne przy tworzeniu tabel, kolumn itp. Ustawienie szerokości nie odbywa się raz na zawsze. Dotyczy tylko najbliższej operacji we/wy. Potem automatycznie zaczyna obowiązywać domniemanie, czyli 0.
C/C++
long kwota[] = { 120, 1650000, 5200, 190000123 };
for( int i = 0; i < 4; i++ )
{
    cout << "Rachunek nr ";
    cout.width( 2 );
    cout << i << " opiewa na sume :";
    cout.width( 10 );
    cout << kwota[ i ] << " DM\n";
}
Aby sprawdzić jakie parametry są ustawione trzeba postąpić następująco:
C/C++
cout.width( 10 );
cout <<( cout.width() ); //10

fill()

czyli wypełnianie. Jeśli chcemy liczbę 2 cyfrową zapisać na 7 miejscach automatycznie zostanie ona uzupełniona spacjami, dzięki fill możemy zmienić wypełnianie na * lub inny symbol.
C/C++
long kwota[] = { 120, 1650000, 5200, 190000123 };
for( int i = 0; i < 4; i++ )
{
    cout << "Rachunek nr ";
    cout.width( 2 );
    cout.fill( '*' );
    cout << i << " opiewa na sume :";
    cout.width( 10 );
    cout.fill( '_' );
    cout << kwota[ i ] << " DM\n";
}
Aby sprawdzić jakie parametry są ustawione trzeba postąpić następująco:
cout <<( cout.fill() );
W przeciwieństwie do width fill daje efekt trwały, to zaczy, że dane wypełnienie będzie obowiązywać do mamętu aż go nie zmienimy.

precision()

pozwala określić dokładność wypisywanych liczb zmiennoprzecinkowych. Domniemenie liczby są wypisywane z dokładnością do 6 miejsc po przecinku, chyba że są to nieznaczące zera.
C/C++
double kwota2[] = { 1.123456789123, 2.12345, 3.1 };
cout << kwota2[ 0 ] << " DM\n"; //bez formatowania polazuje tylko 6 miejsc
cout.precision( 15 );
for( int i = 0; i < 3; i++ )
{
    cout << "Rachunek nr ";
    cout << i << " opiewa na sume :";
    cout << kwota2[ i ] << " DM\n";
}

Manipulatory

Manipulatory to specjalne wartości, które można wstawić do strumienia albo z niego wyjąć, po to aby wywołać zamierzony efekt, polegający na zmianie sposobu formatowania.
Manipulatorów używamy tak, jak byśmy chcieli wypisać na ekranie obiekt, np. hex.

Manipulatory bezargumentowe

  • hex, dec, oct
    C/C++
    int i = 31;
    cout << i << endl; //31
    cout.setf( ios::hex, ios::basefield );
    cout << i << endl; //1F
    cout << hex << i << endl; //1F - drugi sposób (16)
    cout << oct << i << endl; //37 - drugi sposób (8)
    cout.setf( ios::dec, ios::basefield );
  • endl -wszyscy wiedzą jak działa (\n)
  • ends -powoduje wstawienie do strumienia znaku NULL. Przydaje się, gdy wypisujemy coś nie na ekran, tylko do tablicy znaków.

Manipulatory parametryczne

Aby móc z nich skorzystać musimy umieścić w programie dyrektywę #include <iomanip>
  • setw(int) -robi to samo co width.
    C/C++
    int m = 437;
    cout << setw( 3 ) << m << setw( 6 ) << m << setw( 11 ) << m << endl;
  • setfill(int) -robi to samo co fill
    C/C++
    int m = 437;
    cout << setw( 3 ) << m << setw( 6 ) << setfill( 'b' ) << m << setw( 11 ) << setfill( '^' ) << m << endl;
  • setprecision(int) -to samo co precision
    C/C++
    double m = 1.123456789;
    cout << setprecision( 2 ) << m
    << "  " << setprecision( 5 ) << m
    << "  " << setprecision( 12 ) << m << endl;
  • setiosflag(long) i resetiosflag(long) -zmieniają wielkość liter w systemie 16-stkowym
    C/C++
    int i = 224;
    cout << hex << i << ", "
    << setiosflags( ios::uppercase ) << i << ", "
    << resetiosflags( ios::uppercase ) << i << endl;

Zmiana koloru czcionki i tekstu

Poprawniej było by "Jak zmienić kolor tekstu w konsolce za pomocą WinAPI"(Jeśli chodzi o WinAPI).

A tera odpowiedz.
w WinAPI jest taka funkcja jak SetConsoleTextAttribute
pozwala ona na modyfikowanie kolorów w konsoli.

C/C++
#include <windows.h>
#include <cstdio>

int main()
{
    SetConsoleTextAttribute( GetStdHandle( STD_OUTPUT_HANDLE ), FOREGROUND_GREEN | FOREGROUND_INTENSITY );
    printf( "Zielony napis" );
   
    system( "pause" );
    return 0;
}

C/C++
#include <windows.h>
#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
   
    HANDLE hOut;
   
    hOut = GetStdHandle( STD_OUTPUT_HANDLE );
    cout << "Standart" << endl << endl;
   
    SetConsoleTextAttribute( hOut, BACKGROUND_RED );
    cout << "This text is red." << flush << endl << endl;
   
    SetConsoleTextAttribute( hOut, FOREGROUND_GREEN );
    cout << "This text is green." << endl << endl;
   
    SetConsoleTextAttribute( hOut, FOREGROUND_BLUE );
    cout << "This text is blue." << endl << endl;
   
    system( "PAUSE" );
    return 0;
}
Poprzedni dokument Następny dokument
Biblioteka <math.h> To jest ostatni dokument.
Nie ma następnego dokumentu.