November 2005
Beginner to intermediate
594 pages
16h 23m
English
You have to count the numbers of characters, words, and lines—or some other type of text element—in a text file.
Use an input stream to read the characters in, one at a time, and increment local
statistics as you encounter characters, words, and line breaks. Example 4-26 contains the function countStuff, which does exactly that.
Example 4-26. Calculating statistics about a text file
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cctype>
using namespace std;
void countStuff(istream& in,
int& chars,
int& words,
int& lines) {
char cur = '\0';
char last = '\0';
chars = words = lines = 0;
while (in.get(cur)) {
if (cur == '\n' ||
(cur == '\f' && last == '\r'))
lines++;
else
chars++;
if (!std::isalnum(cur) && // This is the end of a
std::isalnum(last)) // word
words++;
last = cur;
}
if (chars > 0) { // Adjust word and line
if (std::isalnum(last)) // counts for special
words++; // case
lines++;
}
}
int main(int argc, char** argv) {
if (argc < 2)
return(EXIT_FAILURE);
ifstream in(argv[1]);
if (!in)
exit(EXIT_FAILURE);
int c, w, l;
countStuff(in, c, w, l);
1
cout << "chars: " << c << '\n';
cout << "words: " << w << '\n';
cout << "lines: " << l << '\n';
}The algorithm here is straightforward. Characters are easy: increment the character
count each time you call get on the input stream. Lines are only slightly more difficult, since the way a line ends depends on the operating ...