1 ELEMENTARZ
Model wprowadzania i wyprowadzania danych, realizowany przez funkcje z biblioteki standardowej, jest bardzo prosty. Wejściowy lub wyjściowy tekst - niezależnie od tego, skąd pochodzi ani dokąd zmierza - jest związany ze strumieniem znaków. Taki strumień znaków jest ciągiem znaków podzielonym na wiersze. Każdy wiersz I składa się z zera lub więcej znaków, po których następuje znak nowego wiersza. To biblioteka ponosi odpowiedzialność za dostosowanie każdego strumienia wejściowego czy wyjściowego do tego modelu. Programista piszący w języku C i używający funkcji z biblioteki nie musi się troszczyć o to, jak wiersze są reprezentowane poza programem. ,
Standardowa biblioteka języka C zawiera kilka funkcji czytających lub wypisujących jeden znak. Funkcje getchar i putchar są najprostsze. Przy każdym wywołaniu funkcja getchar pobiera ze strumienia znaków następny znak i wraca z jego wartością. A więc po wykonaniu instrukcji
c = getchar()
zawartością zmiennej c jest następny znak z wejścia. Zwykle znaki pochodzą z klawiatury komputera; danymi pochodzącymi z pliku zajmiemy się w rozdz. 7.
Każde wywołanie funkcji putchar powoduje wypisanie jednego znaku. Instrukcja
putchar(c) j
powoduje więc wypisanie zawartości zmiennej całkowitej C jako znaku na pewnej urządzenie wyjściowe, którym zwykle jest ekran monitora. Wywołania funkcji! putchar i printf mogą być przemieszane; postać wyniku będzie zgodna z kolejnością! tych wywołań.
1-5.1 Kopiowanie plików I
Korzystając z funkcji getchar i putchar, możesz napisać zaskakująco dużo poży*J tecznych programów bez dodatkowych wiadomości o mechanizmach wejściaj -wyjścia. Najprostszym przykładem jest program kopiujący dane znak po znaku tA swojego wejścia na swoje wyjście. Ogólny schemat takiego programu wygląda naj stępująco:
przeczytaj znak II
while (znak nie jest sygnałem końca pliku) !
wypisz właśnie przeczytany znak przeczytaj następny znak
1.5 WEJŚCIE I WYJŚCIE ZNAKOWE
powerea oy
Mis i o 1
po przekształceniu go na język C otrzymujemy program:
#include <stdio.h>
/* przepisz wejście na wyjście; wersja 1 */ main()
int c;
c = getchar(); while (c != EOF) { putchar(c); c = getchar();
Operator relacji != oznacza „różny od”.
To, co pojawia się jako znak z klawiatury lub wyświetla na ekranie, ma oczywiście -jak wszystko inne - swoją reprezentację wewnętrzną, którą jest wzorzec bitowy. Do przechowywania takich danych znakowych wprowadzono specjalny typ char, lecz można używać dowolnego typu całkowitego. My stosujemy typ int z pewnego subtelnego, ale ważnego powodu.
Problem polega na tym, jak odróżnić koniec danych wejściowych od poprawnej danej. Przyjęto konwencję, że gdy wejście jest już puste, wówczas funkcja getchar zwraca wartość, której nie można pomylić z żadnym prawdziwym znakiem. Tę wartość nazwano symbolicznie EOF (ang. end offile), czyli koniec pliku. Typ zmiennej c musimy deklarować tak, aby mogła ona przechować każdą wartość zwracaną przez funkcję getchar. Nie możemy zastosować typu char, ponieważ zmienna c - poza wszystkimi możliwymi wartościami typu char - musi dodatkowo pomieścić wartość EOF. Właśnie dlatego w takich sytuacjach stosujemy typ int.
Stała EOF jest obiektem całkowitym, zdefiniowanym w standardowym pliku nagłówkowym <Stdio.h>. Rzeczywista wartość tej stałej nie ma znaczenia dopóty, dopóki różni się od wszystkich wartości typu char. Zastosowanie stałej symbolicznej EOF upewnia nas w tym, że nasz program nie zależy od żadnej specyficznej wartości numerycznej.
Programiści zaawansowani w języku C mogą napisać program kopiowania w bardziej zwartej postaci. W języku C każde przypisanie, np.
c = getcharO
37