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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Анализ входящих в файл слов 
V
    Опции темы
Gen
Дата 6.11.2006, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем привет!

Не хочу показаться нескромным, но, тем не менее:

Задача состоит в последовательном прохождении файла по строкам, выделении первого слова, входящего в текущую строку и вызова процедуры, сопоставляющей это слово с некоторым количеством заданных.

В зависимости от результата сравнения - к примеру, на экран выводятся соответствующие числа.


Проблема:

К примеру, для данного ниже тестового файла - все работает нормально вплоть до встречи второго по счету специального (!=-1) слова и всех специальных слов после него - проклятая процедура идентифицирует их как слова неспециальные!

НЕ ПОНИМАЮ: Что я делаю не так?? smile smile 

Программа:
Код

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

int KtoEstSlovo(char* slovo)
{
  //cout<<endl<<"++"<<slovo<<endl;
  
  if (!strcmp(slovo,"while")) return 1;
  else if (!strcmp(slovo,"do")) return 2;
  else if (!strcmp(slovo,"{")) return 3;
  else if (!strcmp(slovo,"}")) return 4;
  else if ((*slovo=='/'&&*(slovo+1)=='/')||!strcmp(slovo,"")) return 0;
  else return -1;
}

void main()
{
  FILE* fp;
  if ((fp=fopen("int.txt","r"))==NULL)

    return;

  else {

    char buffer[256];

    while (fgets(buffer,256,fp))
    {
      cout<<buffer;

      //---
      char* zor=strtok(buffer," ");

      int finder=KtoEstSlovo(zor);

      cout<<endl<<finder<<" <<== "<<zor<<endl;

    }
    int a; cin>>a;

  }
}

Тестовый пример (int.txt):
Код

dfffdsfsdgf dfgfdd
//ggfss
 (aa) //00
//aa
} while
{
while
fsdsfd


Добавлено @ 12:16 
ЗЫ: Среда - Borland C++ Builder

Это сообщение отредактировал(а) Gen - 6.11.2006, 12:11
PM MAIL   Вверх
Kuvaldis
Дата 6.11.2006, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



Gen,
Ты не все разделители возможные  вынес во второй параметр фукции strtok()
у тебя стоит только " ", а реально нужно еще и табуляция, и новая строка (для твоей структуры файла)
Код

//-----------------------------------------------------------------------------
#include <iostream.h>
#include <string.h>
#include <stdio.h>
//-----------------------------------------------------------------------------
int KtoEstSlovo(char* slovo);
//-----------------------------------------------------------------------------
void main()    
{    
  FILE* fp;

  if ((fp = fopen("int.txt","r")) == NULL)
    return;

  char buffer[256];
  while (fgets(buffer, 256, fp))
  {
      cout << buffer;
      //---
      char* zor = strtok(buffer, " \n\t");
      int finder = KtoEstSlovo(zor);
      cout << finder << " << == "<< zor << endl << endl;    
  }
  int a;
  cin >> a;    
}
//-----------------------------------------------------------------------------
int KtoEstSlovo(char* slovo)
{
  //cout<<endl<<"++"<<slovo<<endl;

  if (!strcmp(slovo,"while")) return 1;
  else if (!strcmp(slovo,"do")) return 2;
  else if (!strcmp(slovo,"{")) return 3;
  else if (!strcmp(slovo,"}")) return 4;
  else if ((*slovo=='/'&&*(slovo+1)=='/')||!strcmp(slovo,"")) return 0;
  else return -1;
}
//-----------------------------------------------------------------------------


Это сообщение отредактировал(а) Kuvaldis - 6.11.2006, 13:03


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
apook
Дата 6.11.2006, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот еще решение этой глобальной проблемы
Код

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"




int *KtoEstSlovo(char *slovo, char tokstr[])
{
int i=0, a=0, c=0, tokstop=0, wordsum=1;

for(tokstop=0,i=0; *tokstr; tokstr++,i++)    if(*tokstr =='^')    tokstop++;
tokstr = tokstr -i;
if(tokstop ==0)    tokstop=1;
else    tokstop++;

char **tmp =new char*[tokstop];
for(i=0; i<=tokstop; i++)    tmp[i]=new char[20];

for(i=0,a=0,c=0; i<strlen(tokstr); i++)
{
    if(tokstr[i] =='^')
    {
        tmp[a][c] ='\0';
        a++;
        c=0;
        }
    else
    {
        tmp[a][c] =tokstr[i];
        c++;
        }
    }
tmp[a][c] ='\0';


int *result =new int[tokstop];
for(i=0; i<tokstop; i++)    result[i]=0;

strtok(slovo, " ");
for(; ;)
{
if(slovo)
{
for(c=0; c<tokstop; c++)
{
    if(strstr(slovo, tmp[c]) !=NULL)    result[c]=result[c]+1;
    }
slovo=strtok(NULL, " ");
}
else    break;
}

for(c=0; c<tokstop; c++)    delete [] tmp[c];
delete [] tmp;
return result;
}






void main()
{
int i=0;

FILE* fp;
if ((fp=fopen("list.txt", "r"))==NULL)    exit(1);

char ch, buffer[256];
int *result=new int[sizeof(result)];



while (!feof(fp))
{

for(i=0; (ch=fgetc(fp)) !='\n' && ch !='\0'; i++)    buffer[i] =ch;
buffer[i] ='\0';


printf("\n%s\n==========================\n", buffer);
//---
      result=KtoEstSlovo(buffer, "{^do^else^while^for");
//Print Result
if(result[0] >0)    printf("Word \"{\" in string \"%s\" be repeated %d times\n", buffer, result[0]);
if(result[1] >0)    printf("Word \"do\" in string \"%s\" be repeated %d times\n", buffer, result[1]);
if(result[2] >0)    printf("Word \"else\" in string \"%s\" be repeated %d times\n", buffer, result[2]);
if(result[3] >0)    printf("Word \"while\" in string \"%s\" be repeated %d times\n", buffer, result[3]);
if(result[4] >0)    printf("Word \"for\" in string \"%s\" be repeated %d times\n\n", buffer, result[4]);

    }

delete [] result;

 }








Это сообщение отредактировал(а) apook - 6.11.2006, 15:42


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Gen
Дата 6.11.2006, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Kuvaldis, блин, точно!!!!!!!!!!!! Заработало! Спасибо огромное!!!
PM MAIL   Вверх
apook
Дата 6.11.2006, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ваш пример не делает подсчет колшичества слов совпавших со спецсловом
Например результатом прверки строки:
FFFFolclorcdoolgjk{h  { { do
будет оповещение что в строке есть слово  { и  слово do
а мой еще сообщяет сколько раз они входят в строку
Я КРУЧЕ

Это сообщение отредактировал(а) apook - 6.11.2006, 19:32


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Kuvaldis
Дата 6.11.2006, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



apook, 
Цитата

Ваш пример не делает подсчет колшичества слов совпавших со спецсловом
Я КРУЧЕ

ТАк никто и не спорит smile 
А если серьезно, то желательно делать именно то, что от тебя просят (особенно на работе  smile ) . А вдруг требования поменяются (из личного опыта). 
Но за старание и готовность помочь (уже не единожды) получай в репу. smile 


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Gen
Дата 6.11.2006, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



apook, smile да нет, просто это курсач по инфе уровня 3 семестр!!!

Там в задании - каждый новый оператор (не считая односторонних комментов) на новой строке.

Так что - все делалось именно так преднамеренно.

Тем не менее - все равно ОГРОМНОЕ спасибо за участие!!!!!!!!!!!!!!!!!!! =))

Честное слово - код впечатляет.

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


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

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