Модераторы: 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   Вверх
Mayk
Дата 10.2.2006, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(chaos @ 10.2.2006, 19:26 Найти цитируемый пост)

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

только тут надо учитывать, что если char трактуется как signed char (а так скорее всего и есть), то русские буквы и псевдографика(которые как известно имеют номера 0x80-0xFF) тоже будут меньше нуля.


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


Новичок



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

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



В позапрошлом семестре сделал людям кучу курсовиков, связанных со строками.
Вот близкий тебе пример:

Задание на курсовую работу :

Написать программу, открывающую файл, подсчитывающую количество слов в нём и выводящую в некоторый другой файл строки, содержащие слово и количество вхождений слова в исходный файл. Строки должны быть упорядочены по длине слова.

Код

/* ***********************************
  |     filename - "cours12.c"        |
  |                                   |
  |  This program open text file and  |
  | find diferent words and count     |
  | their quantity in text. Result    |
  | save in file by words and         |
  | quantity.                         |
  |                                   |
   \*********************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define IsLetter(x)    (((x>64)&&(x<91))||((x>96)&&(x<123)))
#define IsNotLetter(x) ((x<65)||((x>90)&&(x<97))||(x>122))

char *infName,*outfName,*strFText,*strTime,*strWords,chrAct;
FILE *inFile,*outFile;
int FLen,n,m,QW,*intPos,intTime;

void main(void)
{
 printf ("\nEnter full pathname of input file \n \t-"); /* Input file open  */
 scanf ("%s",infName);                                  /* for read in text */
 inFile = fopen(infName,"rt");                          /* format.          */
 if (inFile==NULL)
     {
      printf ("Error in name of input file! \n");
      getch ();
      return;                                       /* Check on wrong   */
     }

 printf ("Enter full pathname of output file \n \t-");
 scanf ("%s",outfName);                                 /* Output file    */
 outFile = fopen (outfName,"wt");                       /* creat in text  */
 if (outFile==NULL)                                     /* format.        */
    {
     printf ("Error in name of output file! \n");
     getch ();
     return;                                        /* Check on wrong */
    }

 FLen=0;
 strFText=calloc(1024,sizeof(char));
 while((chrAct=fgetc(inFile))!=EOF)
  {
   *(strFText+FLen)=chrAct;
   *(strFText+FLen+1)=0;
   FLen++;
  }

 strWords=calloc(FLen,sizeof(char));
 for(n=0;n<FLen;n++)
  {
   if ((IsLetter(*(strFText+n))&&(n==0))||(IsLetter(*(strFText+n))&&(IsNotLetter(*(strFText+n-1)))))
    {
     strTime=calloc(128,sizeof(char));
     do
      {
       *(strTime+strlen(strTime)+1)=0;
       *(strTime+strlen(strTime))=*(strFText+n);
       n++;
      }
     while(IsLetter(*(strFText+n)));
     strcat(strTime," ");
     if(strstr(strWords,strTime)==NULL)
      {
       strcat(strWords,strTime);
       QW++;
      }
     free(strTime);
    }
  }

 intPos=calloc(QW,sizeof(int));
 m=1;
 while(m<QW)
  {
   *(intPos+m)=(strstr(strWords+*(intPos+m-1)," ")-strWords)+1;
   m++;
  }

 for(m=0;m<QW;m++)
  {
   for(n=m;n<QW;n++)
    {
     if ((strstr(strWords+*(intPos+n)," ")-strWords-*(intPos+n))>(strstr(strWords+*(intPos+m)," ")-strWords-*(intPos+m)))
      {
       intTime=*(intPos+n);
       *(intPos+n)=*(intPos+m);
       *(intPos+m)=intTime;
      }
    }
  }

 for(m=0;m<QW;m++)
  {
   strTime=calloc(128,sizeof(char));
   strncpy(strTime,strWords+*(intPos+m),strstr(strWords+*(intPos+m)," ")-strWords-*(intPos+m));
   intTime=n=0;
   while (strstr(strFText+n,strTime)!=NULL)
    {
     if (IsNotLetter(*(strstr(strFText+n,strTime)-1))&&IsNotLetter(*(strstr(strFText+n,strTime)+strlen(strTime))))
      {
       intTime++;
      }
     n=strstr(strFText+n,strTime)-strFText+strlen(strTime);
    }
   fputs(strTime,outFile);
   itoa(intTime,strTime,10);
   fputs(" ",outFile);
   fputs(strTime,outFile);
   fputs("\n",outFile);
   free(strTime);
  }

 free(intPos);
 free(strWords);
 free(strFText);
 fclose(inFile);
 fclose(outFile);
 return;
}



Это сообщение отредактировал(а) usawal - 12.2.2006, 00:41
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0721 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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