LINUX.ORG.RU

Количество слов в файле

 ,


0

1

Необходимо узнать количество слов в файле. Язык программирования - Си.

Написал следующую функцию:

int CountWords(char filename[])
{   int c;
    int wcount=0, t=0;
    FILE *input;
    input=fopen(filename, "r");
    if(input==NULL)
        fprintf(stderr, "Ошибка при открытии файла %s\n", filename);
    while(!feof(input))
    {
        c=fgetc(input);
        if(isspace(c))
            t=1;
        else
            if(t==1)
            {
                wcount++;
                t=0;
            }
    }
    if(fclose(input)==-1)
        fprintf(stderr, "Ошибка при закрытии файла %s\n", filename);
    return wcount;
}

При тестировании функции заметил, что ее результат не сходится с результатом функции если файл находится в каталоге usr.

wc filename -w
Моя функция возвращает больший результат.

Подскажите, что не так в моей функции и как исправить данную проблему?


Ответ на: комментарий от ziemin

В начале t=1.

А ещё нужно не только пробелы учитывать, но и другие разделители. Запятые и т.д. Можно поменять условие на isalpha или какую-нибудь комбинацию is*.

ziemin ★★
()
Последнее исправление: ziemin (всего исправлений: 1)

Каникулы что ли были?

Прочти сначала про fscanf и напиши нормально.

stopitplease
()
Ответ на: комментарий от ziemin

В начале t=1

Согласен. Но результат будет больше на 1. У меня же отклонение бывает на несколько десятков.

А ещё нужно не только пробелы учитывать, но и другие разделители. Запятые и т.д. Можно поменять условие на isalpha или какую-нибудь комбинацию is*.

Так функция isspace же учитывает не только пробелы, но и другие разделители. Или я ошибаюсь?

galaid
() автор топика
Ответ на: комментарий от galaid

Так функция isspace же учитывает не только пробелы, но и другие разделители. Или я ошибаюсь?

Только невидимые разделителя.

С другой стороны wc, оказывается, пунктуацию не учитывает. Так что, если тебе нужно как в wc, оставь isspace.

ziemin ★★
()
Ответ на: комментарий от ziemin

Батенька, вы ничего не понимаете в конечных автоматах, вероятно t - это состояние нахождения на разделителе.

anonymous
()
Ответ на: комментарий от ziemin

его не надо сбрасывать?

То есть предлагаете сбрасывать сразу после установки? Ну и будет не более 1 слова, вроде.

anonymous
()
Ответ на: комментарий от anonymous

Пардон, неправильно распарсил.. Да тут вроде все равно.

anonymous
()
Ответ на: комментарий от galaid

окей, окей... он часть кореутилз ;)

aol ★★★★★
()

if(input==NULL) fprintf(stderr, «Ошибка при открытии файла %s\n», filename);

1. просто if(!input)

2. добавь EXIT(3) см. man 3 exit

3. код возврата для ошибок, а не для всякой ерунды. Программа должна выдавать 0 если всё хорошо, и не 0, если всё плохо.

emulek
()

Подскажите, что не так в моей функции и как исправить данную проблему?

isspace зависит от локали, поэтому возможно стоит её устанавливать. Надо бы глянуть в исходник wc, но скорее всего он так и делает.

и юникод мать его :)

сейчас вывод должен более-менее сходится с `LC_ALL=C wc filename -w`

MKuznetsov ★★★★★
()

и можно короче записывать:

while((c=fgetc(input))!=EOF)
   wcount+= t==0 ? t=isspace(c)>0 : (t=isspace(c)>0,0);

MKuznetsov ★★★★★
()

если файл находится в каталоге usr

Ты бинари программе скармливаешь штоле? Найди минимальный пример, где есть различия и его проанализируй.

nanoolinux ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.