Прочитать текст файла в массив - C (СИ)

Узнай цену своей работы

Формулировка задачи:

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

Решение задачи: «Прочитать текст файла в массив»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
 
typedef struct word_t
{
   char* pstr;
   size_t length;
}  TWord;
 
typedef struct node_t
{
   TWord data;
   struct node_t* next;
}  TNode;
 
//-----------------------------------------------------------------------------
FILE* OpenFile(const char fname[], const char params[])
{
   FILE* f = fopen(fname, params);
 
   if (f == NULL)
   {
      perror(fname);
      exit(EXIT_FAILURE);
   }
 
   return f;
}
//-----------------------------------------------------------------------------
size_t FileSize(FILE* f)
{
   fseek(f, 0, SEEK_END);
   size_t size = ftell(f);
   fseek(f, 0, SEEK_SET);
 
   return size;
}
//-----------------------------------------------------------------------------
char* LoadFile(const char fname[])
{
   FILE* f = OpenFile(fname, "r");
 
   size_t size = FileSize(f);
 
   char* text = (char*) malloc(size + 1);
 
   size = fread(text, 1, size, f);
   text[size] = 0;
 
   if (size == 0)
   {
      free(text);
      text = NULL;
   }
 
   fclose(f);
 
   return text;
}
//-----------------------------------------------------------------------------
TNode* Push(TNode** list, TWord* data)
{
   TNode* node = (TNode*) malloc(sizeof(TNode));
   node->data = *data;
   node->next = *list;
   *list = node;
 
   return *list;
}
//-----------------------------------------------------------------------------
void Clear(TNode** list)
{
   TNode* node;
 
   while (*list)
   {
      node = *list;
      *list = node->next;
      free(node);
   }
}
//-----------------------------------------------------------------------------
int GetWord(char* text, TWord* word)
{
   for (; *text && !isalpha(*text); ++text) { ; }
 
   word->pstr = text;
 
   for (; *text && isalpha(*text); ++text) { ; }
 
   word->length = text - word->pstr;
 
   return word->length;
}
//-----------------------------------------------------------------------------
TNode* GetListWords(char* text)
{
   TNode* list = NULL;
   TWord word;
 
   while (GetWord(text, &word))
   {
      Push(&list, &word);
 
      text = word.pstr + word.length + 1;
   }
 
   return list;
}
//-----------------------------------------------------------------------------
int IsUnique(const TWord* word)
{
   int isUnique = 1;
   size_t i, j;
 
   for (i = 0; (i < word->length - 1) && isUnique; ++i)
   {
      for (j = i + 1; (j < word->length - 1) && isUnique; ++j)
      {
         isUnique = (word->pstr[i] != word->pstr[j]);
      }
   }
 
   return isUnique;
}
//-----------------------------------------------------------------------------
void PrintNotUnique(const TNode* list)
{
   for (; list; list = list->next)
   {
      if (!IsUnique(&list->data))
      {
         printf("%.*s, ", list->data.length, list->data.pstr);
      }
   }
   printf("\b\b \n");
}
//-----------------------------------------------------------------------------
 
int main(int argc, char* argv[])
{
   if (argc != 2)
   {
      fprintf(stderr, "Udage: program <TEXT FILE>\n");
      return EXIT_FAILURE;
   }
 
   char* text = LoadFile(argv[1]);
 
   TNode* list = GetListWords(text);
 
   PrintNotUnique(list);
 
   Clear(&list);
   free(text);
 
   return EXIT_SUCCESS;
}

Объяснение кода листинга программы

Код начинается с заголовков необходимых библиотек. Далее идут объявления двух структур: word_t и node_t. В функции OpenFile открывается файл с помощью fopen и проверяется его корректность, если файл не может быть открыт, то выводится сообщение об ошибке и программа завершается. Функция FileSize использует fseek и ftell для определения размера файла. Функция LoadFile открывает файл с помощью OpenFile, определяет его размер с помощью FileSize, затем читает содержимое файла в массив символов с помощью fread. Если чтение файла прошло некорректно (файл пуст), то массив символов освобождается с помощью free. Функция Push добавляет новый узел в начало списка. Новый узел содержит слово, которое было получено из текста файла. Функция Clear освобождает память, занимаемую узлами списка. Функция GetWord ищет границы слова в тексте файла. Она начинает с текущего символа и ищет первый не буквенный символ. Затем она возвращает найденное слово, перемещаясь обратно от его конца к началу, и проверяет каждый символ на уникальность. Функция GetListWords создает список слов из текста файла. Функция IsUnique проверяет уникальность слова. Функция PrintNotUnique выводит на экран все слова из списка, которые не являются уникальными. В функции main загружается текст файла в массив символов с помощью LoadFile, затем создается список слов из этого текста с помощью GetListWords. После этого выводится на экран список слов, которые не являются уникальными с помощью PrintNotUnique. В конце программы освобождается память, занимаемая списком и текстом файла.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.143 из 5
Похожие ответы