7 WEJŚCIE I WYJŚCIE
Aby wykazać, że nie ma nic magicznego w takich funkcjach, jak fgets i fputs, przedstawiamy je tutaj skopiowane bezpośrednio z dostępnej nam biblioteki standardowej:
/* fgets: weź co najwyżej n znaków z pliku iop */ char *fgets(char *s, int n, FILE *iop)
register int c; register char *cs;
cs = s;
while (—n > 0 && (c = getc(iop)) != EOF) if ((*cs++ = c) == ’\n') break;
*cs = ’\0’;
return (c == EOF && cs == s) ? NULL : s;
/♦ fputs: wypisz s do pliku iop */ int fputs(char *s, FILE *iop)
int c;
while (c = ♦s++) putc(c, iop);
return ferror(iop) ? EOF : 0;
W standardzie określono, że po wystąpieniu błędu funkcja ferror ma zwracać wartość niezerową; fputs zwraca w takim przypadku EOF, a w pozostałych przypadkach wartość nieujemną.
t
Teraz, za pomocą funkcji fgets, łatwo możemy zrealizować naszą funkcję getline:
/* getline: przeczytaj wiersz, podaj jego długość ♦/ int getline(char *line, int max)
if (fgets(line, max, stdin) == NULL) return 0; else
return strlen(line);
7.8 KILKA UŻYTECZNYCH FUNKCJI
Ćwiczenie 7.6. Napisz program porównujący dwa pliki i wypisują wiersz, w którym pliki się różnią.
Ćwiczenie 7.7. Zmień program wyszukujący według wzorca (z rozdz. 5) tak, aby przyjmował dane wejściowe z zestawu nazwanych plików lub ze standardowego wejścia, jeśli w argumentach wywołania nie podano żadnej nazwy pliku. Czy razem ze znalezionym wierszem trzeba wypisywać nazwę pliku, w którym go znaleziono?
Ćwiczenie 7.8. Utwórz program wypisujący zawartość zestawu plików, z których każdy rozpoczyna się na nowej stronie. Wszystkie strony powinny być opatrzone tytułem i bieżącym numerem strony w ramach każdego pliku z osobna.
W bibliotece standardowej występuje wiele różnorodnych funkcji. W tym punkcie przedstawiamy tylko krótkie opisy tych najczęściej stosowanych. Więcej szczegółów i wiele innych funkcji możesz znaleźć w dodatku B.
Wspominaliśmy już o funkcjach operujących na tekstach - spośród nich omówiliśmy funkcje strlen, strcpy, strcat i strcmp. Ich deklaracje znajdują się w nagłówku <string.h>. Oto zestawienie takich funkcji; w następujących opisach s oraz t są wskaźnikami do znaków (char *), a c oraz n są typu int.
strcat(s.t)
strncat(s,t,n)
strcmp(s.t)
strncmp(słt,n)
strcpy(s,t)
strncpy(s,t,n)
strlen(s)
strchr(s.c)
strrchr(s,c)
dopisuje t na koniec s dopisuje n znaków z t na koniec s zwraca wartość ujemną, zero lub wartość dodatnią odpowiednio dla s < t, s == t lub s > t
robi to samo, co strcmp, ale tylko dla początkowych n znaków t
kopiuje t do s
kopiuje co najwyżej n znaków t do s zwraca długość s
zwraca wskaźnik do pierwszego wystąpienia c w s lub NULL - gdy c nie występuje w s
zwraca wskaźnik do ostatniego wystąpienia c w s lub NULL - gdy c nie występuje w s
221