Программирование в стандарте POSIX


         

При предыдущем чтении дошли до


/* * * * * * * * * * * * * * * * * * * * * */
/* Подсчет символов, слов и строк в файле */
/* * * * * * * * * * * * * * * * * * * * * */
#include
int main (int argc, char *argv[]) {
long nwords = 0; /* Счетчик слов */
long nlines = 0; /* Счетчик строк */
long nchars = 0; /* Счетчик символов */
FILE *fp = stdin; /* Если файл не задан, */
/* читается стандартный ввод */
unsigned char buf [BUFSIZ]; /* Буфер для */
/* чтения файла */
unsigned char *p1; /* Указатель на */
/* обрабатываемую часть буфера */
size_t nbytes = 0; /* Количество прочитанных,*/
/* но не обработанных байт */
register int c; /* Обрабатываемый символ */
int inword = 0; /* Признак - находимся ли мы */
/* внутри слова */
if (argc > 2) {
fprintf (stderr, "Использование: %s [файл]\n",
argv [0]);
return (2);
}
if (argc > 1 && (fp = fopen (argv [1], "r")) ==
NULL) {
perror ("OPEN");
fprintf (stderr, "%s: Не могу открыть файл
%s\n", argv [0], argv[1]);
return (2);
}
p1 = buf;
for (;;) { /* Посимвольная обработка файла */
if (nbytes == 0) { /* Нужно прочитать новую порцию */
if (feof (fp)) {
/* При предыдущем чтении дошли до конца файла */
break;
}
nbytes = fread (p1 = buf, (size_t) 1,
sizeof (buf), fp);
if (ferror (fp)) {
perror ("READ");
fprintf (stderr, "%s: Ошибка чтения из
файла %s:", argv [0],
argc == 1 ? "стандартного ввода" : argv
[1]);
break;
}
if (nbytes == 0) {
/* В файле не оставалось непрочитанных символов */
break;
}
nchars += nbytes;
}
c = *p1++; /* Обработка одного символа */
nbytes--;
if (c > ' ') {
if (!inword) {
nwords++;
inword = 1;
}
continue;
}
if (c == '\n') {
nlines++;
} else if (c != ' ' && c != '\t') {
continue;
}
inword = 0;
}
if (argc > 1) {
fclose (fp);
}
printf ("Файл %s: строк: %ld, слов: %ld,
символов: %ld\n",
argc == 1 ? "стандартного ввода" : argv [1],
nlines, nwords, nchars);
return (0);
}

Содержание  Назад  Вперед