Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > У файле нужно посчитать количество слов


Автор: sswt 7.10.2015, 22:22
Нужно у файле посчитать количество слов. Кажеться правильно сделал, но ответ не правильный. Где ошибка?
Код

void Ex()
{
    const char* fileName = "D:\\file8.txt";
    FILE* fileInput = fopen(fileName, "r");
    if (fileInput == nullptr)
        return;
    while (true)
    {
        char symbol;
        int colWord = 0;
        if (fscanf(fileInput, "%d", &symbol) != EOF)
        {
             if ((symbol == '\n') || (symbol == ' ') || (symbol == '\t'))
                ++colWord;
         }
            fclose(fileInput);
            printf("colWord = %d", colWord);
        
    }
}
int main()
{
    Ex();
    return 0;
}

Автор: baldman88 7.10.2015, 23:02
А оно вообще работает? Это же бесконечный цикл из которого нет выхода. Попробуйте как-то так:
Код

void Ex()
{
    const char* fileName = "D:\\file8.txt";
    FILE* fileInput = fopen(fileName, "r");
    if (fileInput == NULL)
        return;
    char symbol;
    int colWord = 0;
    while ((symbol = fgetc(fileInput)) != EOF)
    {
        if ((symbol == '\n') || (symbol == ' ') || (symbol == '\t'))
        {
            ++colWord;
        }
    }
     fclose(fileInput);
     printf("colWord = %d", colWord);
    }
}

PS: если не работает, я не виноват  smile

Добавлено через 11 минут и 36 секунд
Плюс здесь не учтены всякие знаки препинания, например тире, которое обромляется пробелами с двух сторон, но словом не является.

Автор: math64 8.10.2015, 09:46
Цитата(baldman88 @  7.10.2015,  23:02 Найти цитируемый пост)
Плюс здесь не учтены всякие знаки препинания, например тире, которое обромляется пробелами с двух сторон, но словом не является.

Здесь, как и в примере ТС, считается число непробельных символов.
Нужно как-то так:
Код

    char symbol;
    int colWord = 0;
    bool hasWord = false;
    while ((symbol = fgetc(fileInput)) != EOF)
    {
        if ((symbol == '\n') || (symbol == ' ') || (symbol == '\t'))
        {
            if (!hasWord)
              ++colWord;
            hasWord = true;
        }
        else
        {
            hasWord = false;
        }
    }

Если программируете на C без плюсов, вместо bool использется int (и 0 и 1 вместо false и true) или enum Bool { False, True };
Если хотите учесть знаки препинания, нужно добавить дополнительные if: " - " с пробелами вокруг не является словом, а "кто-то" - одно слово.

Автор: feodorv 8.10.2015, 11:07
Цитата(math64 @  8.10.2015,  09:46 Найти цитируемый пост)
    char symbol;

Здесь, всё-таки, лучше int. Для char и виндовской кодировки, например, 'я' и EOF неразличимы smile 

Автор: sswt 8.10.2015, 12:11
math64,  переделал, но  так и не правильно работает, всегда  о выводит((((
Код

void Ex()
{
    const char* fileName = "D:\\file.txt";
    FILE* fileInput = fopen(fileName, "r");
    if (fileInput == nullptr)
        return;
    int symbol;
    int colWord = 0;
    int hasWord = 0;
    while ((symbol = fgetc(fileInput)) != EOF)
    {
        if ((symbol == '\n') || (symbol == ' ') || (symbol == '\t'))
        {
            if (!hasWord)
                ++colWord;
            hasWord = 1;
        }
        else
        {
            hasWord = 0;
        }
    fclose(fileInput);
    printf("colWord = %d", colWord);
    }
}
int main()
{
    Ex();
    
    return 0;
}

Автор: math64 8.10.2015, 12:49
файл нужно закрывать после цикла, а не на каждой иттерации.
печатать colWord, для отладки, можете и внутри цикла.
Но тогда лучше видеть все переменные:
Код

    printf("symbol = %с, colWord = %d, hasWord = %d\n", symbol, colWord, hasWord);

И кстати, действия по if и else нужно поменять местами.

Автор: a0730 11.10.2015, 18:16
Компилил gcc, работает с UTF8.
Код

#include <stdio.h>
#include <wchar.h>
#include <wctype.h>
#include <locale.h>

int main(int argc, char** argv)
{
    setlocale(LC_ALL, "ru_RU.UTF-8");
    while( --argc )
    {
        FILE* fp = fopen(*++argv, "r");
        if( fp != NULL )
        {
            wint_t c = 0;
            int wordCount = 0;
            int wordFound = 0;
            while( 1 )
            {
                c = fgetwc(fp);
                if( c == WEOF )
                {
                    break;
                }
                if( wordFound == 0 )
                {
                    if( iswalpha(c) )
                    {
                        wordFound = 1;
                    }
                }
                else
                {
                    if( !iswalpha(c) )
                    {
                        wordFound = 0;
                        ++wordCount;
                    }
                }
            }
            fclose(fp);
            if( wordFound )
            {
                ++wordCount;
            }
            printf("Количество слов: %d\n", wordCount);
        }
    }
}



Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/U-fayle-nuzhno-poschitat-kolichestvo-slov-id56157154ae2015ca748b4567#findElement_E7045_561a7d62ae2015a769b12c69_0

Автор: baldman88 12.10.2015, 16:37
Цитата(math64 @  8.10.2015,  09:46 Найти цитируемый пост)
Здесь, как и в примере ТС, считается число непробельных символов.

Логику подсчета слов не трогал, просто подсказал автору, где он сделал явно неправильно (посимвольное чтение до конца файла, вместо бесконечного цикла; закрытие файла только после полного прочтения, а не на каждой итерации цикла).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)