#include #include #include #include #define BUFFSIZE 512 /* Small buffer for debugging */ #define TRUE 1 #define FALSE 0 #define FACTOR 1.1 /* Vowels per syllable in typical file */ /* Conditional operator prevents divide by zero */ #define WPS (float)words / (sentences ? sentences : 1) #define LPW (float)letters / (words ? words : 1) #define SPW (vowels * FACTOR) / (words ? words : 1) int bytes = 0, characters = 0, words = 0, lines = 0; int letters = 0, vowels = 0, sentences = 0; char buffer[BUFFSIZE]; main(argc,argv) int argc; char *argv[]; { FILE *stream; int namebuf[15]; char *name; int numread; char inword = FALSE; /* Get a file if one was not specified as an argument */ if (argc > 1) name = argv[1]; else { printf("Enter file name: "); name = gets(namebuf); } /* Open file in binary mode */ if ((stream = fopen(name,"rb")) == NULL) return (1); /* Read file buffers, passing bytes read and inword status */ while ((numread = fread(buffer,1,BUFFSIZE,stream)) != 0) inword = countwords(inword,numread); /* Calculate and print the results */ printf("\n\n\t\tFile statistics\n\n"); printf("\t\tBytes: %d \n",bytes); printf("\t\tCharacters: %d \n",characters); printf("\t\tLetters: %d \n",letters); printf("\t\tVowels: %d \n",vowels); printf("\t\tConsonants %d \n",letters - vowels); printf("\t\tWords: %d \n",words); printf("\t\tLines: %d \n",lines ? lines : 1); printf("\t\tSentences: %d \n",sentences); printf("\t\tWords per sentence: %-.1f \n",WPS); printf("\t\tLetters per word: %-.1f \n",LPW); printf("\t\tEstimated syllables per word: %-.1f \n",SPW); return (0); } /* * Analyze the chars in one buffer. * * Increment bytes. For each char, increment characters, * lines, and/or words if appropriate. For each character, * call analyze function. (A character is defined as a * printable ASCII code.) */ countwords(inword,numread) char inword; int numread; { int count; char code; bytes += numread; for (count = 0; count <= numread; ++count) { code = buffer[count]; if (code == '\n') ++lines; if (!inword) { if (code > ' ') { analyze(code,inword); inword = TRUE; ++words; ++characters; } } else { if (code <= ' ') inword = FALSE; else { ++characters; analyze(code,inword); } } } return(inword); } /* * Analyze a character. * * Increment letters, vowels, and/or sentences * if appropriate. */ analyze(code,inword) char code; char inword; { if (isalpha(code)) { ++letters; if ((strchr("AEIOUaeiou",code)) || (strchr("Yy",code) && inword)) ++vowels; } else { if (strchr(".!?",code)) ++sentences; } }