MaxTTT Ответов: 1

Подсчет частоты слов в тексте C


Я нашел код C для подсчета частоты слов в текстовом файле, но он работает только с >1000 словами, и мне нужно использовать его с файлами, содержащими +40000 слов.
Как я могу исправить это для работы с большими файлами?

Код:

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

int main(int argc, char* argv[])
{
   if (argc == 1) {
   printf("The input file name has not been provided\n");
   }
   else if (argc == 2) {
   FILE *f = fopen(argv[1], "rb");
   fseek(f, 0, SEEK_END);
   long fsize = ftell(f);
   fseek(f, 0, SEEK_SET);

   char *str = malloc(fsize + 1);
   fread(str, fsize, 1, f);
   fclose(f);

   str[fsize] = 0;
   int count = 0, c = 0, i, j = 0, k, space = 0;
   char p[1000][512], str1[512], ptr1[1000][512];
   char *ptr;
   for (i = 0;i<strlen(str);i++)
   {
   if ((str[i] == ' ')||(str[i] == ',')||(str[i] == '.'))
   {
   space++;
   }
   }
   for (i = 0, j = 0, k = 0;j < strlen(str);j++)
   {
   if ((str[j] == ' ')||(str[j] == 44)||(str[j] == 46))
   {
   p[i][k] = '\0';
   i++;
   k = 0;
   }
   else
   p[i][k++] = str[j];
   }
   k = 0;
   for (i = 0;i <= space;i++)
   {
   for (j = 0;j <= space;j++)
   {
   if (i == j)
   {
   strcpy(ptr1[k], p[i]);
   k++;
   count++;
   break;
   }
   else
   {
   if (strcmp(ptr1[j], p[i]) != 0)
   continue;
   else
   break;
   }
   }
   }
   for (i = 0;i < count;i++)
   {
   for (j = 0;j <= space;j++)
   {
   if (strcmp(ptr1[i], p[j]) == 0)
   c++;
   }
   printf("%s %d \n", ptr1[i], c);
   c = 0;
   }
   }
   return 0;

}


Что я уже пробовал:

Я думаю, что проблема-то в том, связанные с: П[1000][512], str1 выглядит следующим образом[512], ptr1 выглядит следующим образом[1000][512]

Patrice T

Этот код не является полным.

MaxTTT

извините, плохая копипаста. теперь все готово

Graeme_Grant

Formattingalwaysmakesiteasiertoread. Особенно когда просят о помощи.

MaxTTT

Я вижу. Спасибо!

PIEBALDconsult

Как и в любом другом случае, не пытайтесь делать все сразу; разбейте задачу на подзадачи.

1 Ответов

Рейтинг:
2

Patrice T

Научитесь правильно делать отступы в вашем коде, это покажет его структуру, и это поможет чтению и пониманию. Это также помогает выявлять структурные ошибки.

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

int main(int argc, char* argv[])
{
  if (argc == 1) {
    printf("The input file name has not been provided\n");
  }
  else if (argc == 2) {
    FILE *f = fopen(argv[1], "rb");
    fseek(f, 0, SEEK_END);
    long fsize = ftell(f);
    fseek(f, 0, SEEK_SET);

    char *str = malloc(fsize + 1);
    fread(str, fsize, 1, f);
    fclose(f);

    str[fsize] = 0;
    int count = 0, c = 0, i, j = 0, k, space = 0;
    char p[1000][512], str1[512], ptr1[1000][512];
    char *ptr;
    for (i = 0;i<strlen(str);i++)
    {
      if ((str[i] == ' ')||(str[i] == ',')||(str[i] == '.'))
      {
        space++;
      }
    }
    for (i = 0, j = 0, k = 0;j < strlen(str);j++)
    {
      if ((str[j] == ' ')||(str[j] == 44)||(str[j] == 46))
      {
        p[i][k] = '\0';
        i++;
        k = 0;
      }
      else
        p[i][k++] = str[j];
    }
    k = 0;
    for (i = 0;i <= space;i++)
    {
      for (j = 0;j <= space;j++)
      {
        if (i == j)
        {
          strcpy(ptr1[k], p[i]);
          k++;
          count++;
          break;
        }
        else
        {
          if (strcmp(ptr1[j], p[i]) != 0)
            continue;
          else
            break;
        }
      }
    }
    for (i = 0;i < count;i++)
    {
      for (j = 0;j <= space;j++)
      {
        if (strcmp(ptr1[i], p[j]) == 0)
          c++;
      }
      printf("%s %d \n", ptr1[i], c);
      c = 0;
    }
  }
  return 0;

}

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]

Комментарии в коде также являются хорошей идеей.

Цитата:
Я думаю, что проблема-то в том, связанные с: П[1000][512], str1 выглядит следующим образом[512], ptr1 выглядит следующим образом[1000][512]

Есть простой способ узнать, попробуйте, и вы увидите.

Насколько я понимаю этот код, он крайне неэффективен. Это грубая сила, как во время выполнения, так и в памяти.