node111






16.4 Zapis i odczyt nieformatowany



























Dalej: 16.5 Pliki
W górę: 16. Operacje wejścia/wyjścia
Wstecz: 16.3 Formatowanie




Podrozdziały


16.4.1 Odczyt nieformatowany
16.4.2 Zapis nieformatowany






16.4 Zapis i odczyt nieformatowany



Do tej pory mówiliśmy o zapisie/odczycie formatowanym -
informacja czytana lub pisana jest w jakiś sposób interpretowana:
opuszczane są białe znaki, dokonuje się przekształceń liczb do
napisów w różnych formatach itd. Istnieją też operacje we/wy
nieformatowane, które czytają lub piszą „surowe'' bajty - bez
ich żadnej interpretacji.





16.4.1 Odczyt nieformatowany



Na rzecz obiektu strumieniowego mogą być też wywołane metody
powodujące wczytanie danych ze strumienia bez ich interpretacji
i formatowania.
Należą do nich następujące metody:








istream& get(char& c) - czyta jeden bajt;
zwraca
odnośnik do strumienia, na rzecz którego została
wywołana, więc może być używana kaskadowo.
Argument typu
char jest przesyłany przez odniesienie;
po powrocie jego wartością będzie wczytany znak. Może to
być dowolny znak, również znak kontrolny, biały
lub zerowy (czyli '

\0').
Jeśli czytanie nie powiodło się, bo napotkany został koniec
pliku, znak
c będzie równy

EOF,
czyli
znak, który w danym systemie operacyjnym oznacza koniec danych
(Ctrl-Z w Windows, Ctrl-D pod Uniksem/Linuksem).
Sam strumień będzie wtedy w stanie błędu. Poznać to można
przez wymuszenie konwersji zmiennej strumieniowej do typu

void* - jeśli strumień jest „dobry'' to otrzymamy
wartość niezerową, jeśli zły, to otrzymamay
NULL.
Taka konwersja zachodzi automatycznie w kontekście, w którym
wymagana jest wartość logiczna, a zatem można jej użyć
bezpośrednio do części testującej instrukcji

if,
for,
while itd. Na przykład, jeśli

strin jest strumieniem wejściowym związanym
z plikiem, to można zawartość tego pliku przekopiować
na standardowe wyjście prostą pętlą




char c;
while (strin.get(c)) cout << c;



Kaskadowość funkcji
get można wykorzystać
w konstrukcjach typu
char a, b, c;
strm.get(a).get(b).get(c);



przy czym w ten sposób możemy wczytać dowolne znaki;
bez żadnego opuszczania białych znaków,
interpretacji znaku końca linii itp.






int get() - zwraca wczytany znak w formie liczby
typu
int; w razie napotkania końca pliku zwrócone
zostanie
EOF. Ta forma funkcji
get nie
zwraca odniesienia do strumienia, więc nie może być używana
kaskadowo.






istream& get(char* buf, streamsize length, char termin = '\n') -
czyta do łańcucha (napisu)
buf - czyli do
pamięci
poczynając od adresu będącego wartością wskaźnika

buf - maksymalnie
length-1 bajtów.
Znak
NUL (zerowy) jest
automatycznie dodawany na koniec łańcucha
buf.
Bajt numer
length ze strumienia nie jest już
wczytywany. Wczytywanie kończy się również, jeśli napotkany
zostanie znak
termin (domyślnie, jak widać z
nagłówka, jest to znak końca linii

'\n').
Znak
NUL też zostanie
wtedy dopisany do łańcucha
buf, ale sam znak

termin pozostaje w strumieniu jako
„niewyczytany'' i nie jest umieszczany w wyjściowym buforze

buf. Zatem przed wczytaniem kolejnych danych
należy go zwykle „wyczytać'' - można to zrobić za pomocą
funkcji
ignore opisanej dalej.
Oczywiście przekazany do funkcji bufor musi istnieć, to znaczy
pamięć na ten bufor musiała zostać zaalokowana w funkcji
wołającej. Drugi parametr funkcji jest typu

streamsize,
co jest aliasem pewnego typu całkowitego.
Funkcja zwraca odnośnik do strumienia, na rzecz którego
została wywołana (
*this).






istream& getline(char* buf, streamsize length, char termin = '\n')
-
działa dokładnie tak jak poprzednia funkcja, ale znak

termin jest wyjmowany ze
strumienia, choć nie jest umieszczany w buforze

buf. Jest to zatem metoda znacznie praktyczniejsza
od poprzedniej przy wczytywania kolejnych linii tekstu.






istream& read(char* buf, streamsize length)
-
wczytuje
length bajtów do bufora
buf.
Czytanie może się zakończyć przedwcześnie tylko, jeśli
napotkany został koniec danych. O tym, ile rzeczywiście
bajtów zostało wczytanych, można się przekonać wywołując
bezpośrednio po czytaniu funkcję
gcount (patrz dalej).
Funkcja czyta surowe bajty i nie dostawia znaku końca napisu
ani żadnego innego. Stosuje się ją zwykle do czytania danych
nietekstowych. Funkcja zwraca odnośnik do strumienia na
rzecz którego została wywołana (
*this).






istream& ignore(streamsize length = 1, int termin = EOF)

-
wczytuje
length znaków
(domyślnie jeden znak), nigdzie ich nie wpisuje.
Jeśli napotkany został znak
termin (domyślnie
koniec pliku), to jest on usuwany ze strumienia i czytanie
kończy się.
Funkcja zwraca odnośnik do strumienia, na rzecz którego
została wywołana.






int gcount( )
-
zwraca liczbę wczytanych
ze strumienia bajtów podczas wykonywania ostatniej funkcji
nieformatowanego wejścia.






int peek( )
-
zwraca jeden znak ze
strumienia w postaci zmiennej typu
int - może to być

EOF jeśli napotkany został koniec pliku.
Znak pozostaje w strumieniu i będzie pierwszym znakiem
wczytanym przy następnej operacji czytania.






istream& putback(char znak)
-
wstawia znak
znak do strumienia; będzie on pierwszym
znakiem wczytanym przez następną operację czytania.
Zwraca odnośnik do strumienia, na rzecz którego
została wywołana. Nie do każdego strumienia i nie zawsze
można wstawić znak.






istream& unget()
-
wstawia ostatnio przeczytany znak z powrotem do strumienia;
będzie on pierwszym
znakiem wczytanym przez następną operację czytania.
Zwraca odnośnik do strumienia, na rzecz którego
została wywołana.




Kilka z tych funkcji użytych zostało w poniższym programie,
który czyta kolejne linie ze standardowego wejścia i wyświetla
je bez zmian, ale pomijając komentarze, czyli fragmenty od dwuznaku
'
//' do końca linii:



Wyszukiwarka

Podobne podstrony:
node114
node111
node116 4UC7GXFRCZ7NKN4JHF3I4Y2XTR36JORXZIF3AJQ
node110
node116
node117 O4BUZZ7SCQI2MQBP2TR66PL2YENB23E2PD2JG3Q
node112 1
node116 1
node11

więcej podobnych podstron