Здравствуйте, vfores!
В значительной мере переработал исходный текст утилиты wc (Word Count):
1) Убрал все сообщения об ошибках;
2) Убрал подсчёт символов и строк в файле;
3) В качестве аргумента программа теперь принимает одно (и только одно) имя файла;
4) Три функции, ответственные в оригинальной версии программы Word Count за подсчёт слов в файле, объединил в одну - int iProcessFile(char* psFileName);
5) Поскольку текст утилиты несколько запутан в связи со спецификой работы, для подсчёта слов в файле использовал код, предложенный ранее
Лысковым Игорем Витальевичем.
Программа, как и оригинальный вариант, написана на Си, комментированный код см. в приложении.
Пример работы программы представлен в прикреплённом скриншоте.
Приложение:
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <ctype.h>
//---------------------------------------------------------------------------------------------
int iWordsCount = 0;
//---------------------------------------------------------------------------------------------
int iProcessFile(char* psFileName)
{
char cCharacter; // Текущий символ.
// Флаги состояния разделителей слов - пробелов.
int iSpacePrevious;
int iSpaceCurrent = 1; // Предположим, что текущий символ - пробел
// Открываем файл.
FILE* pFile = fopen(psFileName, "r");
// Если не смогли открыть файл - выходим.
if(!pFile)
{
printf("Невозможно открыть файл '%s'\n", psFileName);
return 1;
}
// Если файл пуст, выходим.
else if(feof(pFile)) return 0;
else
{
// Считываем символы из файла.
// Достигнув конца файла - выходим.
while((cCharacter = getc(pFile)) != EOF)
{
// Запоминаем текущий флаг как предыдущий
iSpacePrevious = iSpaceCurrent;
// Проверяем, является ли текущий символ пробелом
iSpaceCurrent = isspace(cCharacter);
// Если предыдущий символ - пробел (флаг равен 1), а текущий - нет,
// т.е. начало нового слова, то увеличиваем счётчик слов.
iWordsCount += iSpacePrevious && !iSpaceCurrent;
}
}
// Закрываем файл.
fclose(pFile);
return 0;
}
//---------------------------------------------------------------------------------------------
int main(int iArgc, char* psArgv[])
{
if(iArgc < 2) printf("Использование программы: wc [FILE]\n");
else if(iArgc > 2) printf("Слишком много аргументов!\n");
else
{
if(iProcessFile(psArgv[1]) == 0)
{
printf("Файл '%s' содержит %i слов.\n", psArgv[1], iWordsCount);
}
}
return 0;
}