Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> У файле нужно посчитать количество слов 
:(
    Опции темы
sswt
Дата 7.10.2015, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 22.9.2015

Репутация: нет
Всего: нет



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

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;
}


Это сообщение отредактировал(а) sswt - 7.10.2015, 22:40
PM MAIL   Вверх
baldman88
Дата 7.10.2015, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: 1
Всего: 7



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

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 секунд
Плюс здесь не учтены всякие знаки препинания, например тире, которое обромляется пробелами с двух сторон, но словом не является.

Это сообщение отредактировал(а) baldman88 - 7.10.2015, 23:08
PM MAIL   Вверх
math64
Дата 8.10.2015, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Цитата(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: " - " с пробелами вокруг не является словом, а "кто-то" - одно слово.
PM   Вверх
feodorv
Дата 8.10.2015, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



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

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


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
sswt
Дата 8.10.2015, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 22.9.2015

Репутация: нет
Всего: нет



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;
}

PM MAIL   Вверх
math64
Дата 8.10.2015, 12:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



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

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

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

Это сообщение отредактировал(а) math64 - 8.10.2015, 12:54
PM   Вверх
a0730
Дата 11.10.2015, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Компилил 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://vingrad.com
PM MAIL   Вверх
baldman88
Дата 12.10.2015, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: 1
Всего: 7



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

Логику подсчета слов не трогал, просто подсказал автору, где он сделал явно неправильно (посимвольное чтение до конца файла, вместо бесконечного цикла; закрытие файла только после полного прочтения, а не на каждой итерации цикла).
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0793 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.