Прочитать текст файла в массив - C (СИ)
Формулировка задачи:
Решение задачи: «Прочитать текст файла в массив»
#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
. В конце программы освобождается память, занимаемая списком и текстом файла.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д