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

Поиск:

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


Опытный
**


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

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



Как посчитать количество слов в файле?
Если словом нужно считать то что отделено пробелами, enterom and Tab

Вот посчитать количество символов можно, но вот как посчитать слова?

Кто-нибудь встречался с ткой задачей?

Язык програмирования Си. smile


--------------------

Утсанвлен Денвер
1. PHP Version 5.1.6
2. MySQL 5.0.18-max
3. phpMyAdmin 2.6.1
PM MAIL WWW ICQ   Вверх
KyKy
Дата 9.2.2006, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


КуКу



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

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



Думается нужно считать до того как слово кончиться, а знашь пробел это первое слово,дальше тарам пам пам - пробел,слово и т.д.
PM MAIL WWW ICQ   Вверх
Бегемот
Дата 9.2.2006, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 26.1.2005
Где: На границе Европы и Азии

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



Enya, самый простой вариант!
Код

#include<stdio.h>
#include<conio.h>
void main()
{
   FILE* InputFile;
   if((InputFile = fopen("Name.txt", "r")) == NULL)
   {
      printf("Can not open file!\n");
      getch();
      return;
   }
   char symbol;
   int ColWord=0;
   while((symbol = fgetc(InputFile)) != EOF)
   {
      if((symbol == '\n') || (symbol == ' ') || (symbol == '\t'))
         ColWord++;
   }
   fclose(InputFile);
   printf("ColWord = %i", ColWord);
   getch();
}

PM MAIL   Вверх
volvo877
Дата 9.2.2006, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Бегемот,
а в файле строка:
Код

"Ну и     сколько    здесь слов?"


дубликаты символов табуляции не должны подсчитываться... Если будет 10 пробелов подряд - не значит, что счетчик слов должен увеличиться на 10...

Это сообщение отредактировал(а) volvo877 - 9.2.2006, 23:58
PM MAIL   Вверх
Бегемот
Дата 10.2.2006, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 26.1.2005
Где: На границе Европы и Азии

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



volvo877, понятное дело!
Я же сказал, что самый простой вариант! Простой и очень критичный к содержимому файла! Двойное и более дублирование пробелов, символов новой строки и табуляции он не видит! А ещё...А ещё, если функция fgetc не сможет прочитать из потока символ, она вернёт EOF, что может послужить причиной недосчёта! smile

PM MAIL   Вверх
Mayk
Дата 10.2.2006, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



Самый простой вариант, который приходит в голову, это
Код

int main()
{
        char s[20480];
        int words=0;
        while(scanf("%s",s) > 0)
                ++words;
        printf("%d\n",words);
}

на
Цитата

324324 32 444444444
382844        4324  423
333
3
3
1

выдаёт 10.

Ну или более безопасный вариант
Код

#include <stdio.h>
int main()
{
        char s[6]={[5]=1};

        int words=0;
        char c;

        while(scanf("%5s",s) > 0){
                if(s[5] != 0){
                        ++words;
                        continue;
                }
                s[5]=1;
                c=getchar();
                if(isspace(c))
                        ++words;
                ungetc(c,stdin);
        }
        printf("words:%d\n",words);
}


Это сообщение отредактировал(а) Mayk - 10.2.2006, 07:58


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
chaos
Дата 10.2.2006, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


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

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



надо смотреть шырше на задачу smile
я бы сделал так
Код

ifstream ifs;
ifs.open("worlds.txt");

string str;
while (! ifs.eof())
{
    ifs >> str;
    cout << str << endl;
}




Это сообщение отредактировал(а) chaos - 10.2.2006, 15:35
PM WWW   Вверх
Mayk
Дата 10.2.2006, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



chaos
Тогда уж ifs >> str smile
Но в любом случае это С++, а не Си.

ps. Даже вот так smile
Код

#include <string>
#include <iostream>
using namespace std;
int main()
{
        string str;
        int words=0;
        while(cin >> str)
                ++words;
        cout << words;
}


Это сообщение отредактировал(а) Mayk - 10.2.2006, 08:48


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
chaos
Дата 10.2.2006, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


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

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



Цитата(Mayk @ 10.2.2006, 08:39)
chaos
Тогда уж ifs >> str smile
Но в любом случае это С++, а не Си.

упс smile
забыл убрать, сории за невнимательность
и видимо по диаганали прочитал топик)) раз не заметил что на Си надо
PM WWW   Вверх
chaos
Дата 10.2.2006, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


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

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



вот еще один пример на этот раз на СИ(вроде как такая же идея была у KyKy)
Код

int main(int argc, char* argv[])
{
    int fSpace = 1, nCount = 0;
    char ch[2] = {0};

    FILE *fh = fopen("wrlds.txt", "r");

    while (! feof(fh))
    {
        fgets(ch, 2, fh);
        if (ch[0] > 32)
            fSpace = 0;
        else if (0 == fSpace)
        {
            nCount++;
            fSpace = 1;
        }

        ch[0] = 0;
    }
    fclose(fh);

    printf("%d\n", nCount);
    
    return 0;
}


Это сообщение отредактировал(а) chaos - 10.2.2006, 09:34
PM WWW   Вверх
Enya
Дата 10.2.2006, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



chaos, а можешь раъяснить принцып действия?
Код

//условие понятно пока не закончиться фаил цикл будет работать.
while (! feof(fh))
    {
        //а вот тут не совсем понятно лишь догатки
        fgets(ch, 2, fh);
        if (ch[0] > 32)
            fSpace = 0;
        else if (0 == fSpace)
        {
            nCount++;
            fSpace = 1;
        }
        ch[0] = 0;
    }



--------------------

Утсанвлен Денвер
1. PHP Version 5.1.6
2. MySQL 5.0.18-max
3. phpMyAdmin 2.6.1
PM MAIL WWW ICQ   Вверх
ManiaK
Дата 10.2.2006, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

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



chaos, Mayk Прикольно, конечно, smile но... вроде автора темы уважать неплохо. Новичёк smile
PM MAIL WWW   Вверх
Enya
Дата 10.2.2006, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ManiaK, я учусь. И очень сильно тружусь. Я предполагала, что проще будет перебрать фаил и когда в переборе встречаются символы '\n' ' ' ' \t' отключать сётчик. Я так планировала. А chaos сделал судя по всему гораздо проще, было интересно узнать ход ег омыслей.


--------------------

Утсанвлен Денвер
1. PHP Version 5.1.6
2. MySQL 5.0.18-max
3. phpMyAdmin 2.6.1
PM MAIL WWW ICQ   Вверх
Aleksandor
Дата 10.2.2006, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

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



Перебирая по символу в цикле-
{
если ((это первый символ И его код больше пробела) ИЛИ (код символа меньше или равен пробелу) ) уст флаг=1

передвинуть указатель на следующий символ

если (код символа больше пробела И флаг==1) инкрементировать счетчик слов

сбросить флаг=0
}


--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
chaos
Дата 10.2.2006, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


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

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



Enya
Идея вообще такая: как только мы встретили символ код каторого меньш 33(те всякие там пробелы, переводы строк и тп дрянь) и перед этим кодом был символ(те код больше 32, определяем был ли символ или пробел через флаг fSpace) то можно сказать что кончилось слово

Код

fgets(ch, 2, fh);//читаю один символ: ch[0] - непосредственно символ ch[1] символ '\0'
if (ch[0] > 32) //если печатный символ
    fSpace = 0; //ставим влаг - не пробел
else if (0 == fSpace) //если пробел и тп И до этого был не пробел
{
    nCount++;//увеличиваем счетчик слов
    fSpace = 1;//ставим флаг - пробел что бы если на след итерции встретился пробел мы на него забили
}


Это сообщение отредактировал(а) chaos - 10.2.2006, 15:29
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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