Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Анализ входящих в файл слов


Автор: Gen 6.11.2006, 12:08
Всем привет!

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

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

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


Проблема:

К примеру, для данного ниже тестового файла - все работает нормально вплоть до встречи второго по счету специального (!=-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

Автор: Kuvaldis 6.11.2006, 13:01
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;
}
//-----------------------------------------------------------------------------

Автор: apook 6.11.2006, 14:56
Вот еще решение этой глобальной проблемы
Код

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

 }







Автор: Gen 6.11.2006, 18:19
Kuvaldis, блин, точно!!!!!!!!!!!! Заработало! Спасибо огромное!!!

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

Автор: Kuvaldis 6.11.2006, 19:37
apook, 
Цитата

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

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

Автор: Gen 6.11.2006, 19:42
apook, smile да нет, просто это курсач по инфе уровня 3 семестр!!!

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

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

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

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

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