行数を数える #4
行数をカウントする部分をファイルストリームを引数とする関数にする。
#include <stdio.h> typedef enum { FALSE = 0 } bool_t; unsigned long count_eol(FILE *fp); unsigned long count_eol(FILE *fp) { unsigned long nlines = 0L; bool_t succeeded_eol = FALSE, succeeded_cr = FALSE; int c = getc(fp); if (c != EOF) { do { if (c == '\r') { ++nlines; succeeded_eol = succeeded_cr = ! FALSE; } else { succeeded_eol = c == '\n'; if (succeeded_eol && ! succeeded_cr) ++nlines; succeeded_cr = FALSE; } } while ((c = getc(fp)) != EOF); if (! succeeded_eol) ++nlines; } return nlines; } int main(void) { printf("%lu\n", count_eol(stdin)); return 0; }