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


Пример 5.11


/* * * * * * * * * * * * * * * * * * * * * */

/* Подсчет символов, слов и строк в файле */

/* * * * * * * * * * * * * * * * * * * * * */

#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);

}




Начало  Назад  Вперед



Книжный магазин