Выполнить считывание и заполнение массива строк из заданного текстового файла - C (СИ)
Формулировка задачи:
Реализовать работу с массивом строк:
a. Выполнить считывание и заполнение массива строк из заданного текстового файла (для удобства считывания представить строки в файле последовательно, на новой строке - следующая). Вывести считанные строки на экран.
пытаюсь выполнить задание
и написал вот такое )))
3 недели мучаюсь!!
не могу понять почему без динамического массива и без первого цикла do{}while (подсчет количество слов) все работает и и каждый элемент массива равен слову (safe[0] = слово)!а так не работает и выдает ошибку
safe[sl][sm] = e; //в этой строке
может неправильно присваиваю подскажите пожалуйста!!буду признателен и благодарен!!!
#include <stdio.h> #include <conio.h> #include <stdlib.h> char **safe; int main(){ FILE *fp; int kolslov = 0; char e; int sl = 0; int sm = 0; int i=0; // char **safe; char er[] = "oshibka"; int r = 0; char slov[30]; if((fp = fopen("S:/1.txt", "r")) == NULL ){ puts(er); } do{ e = getc(fp); if(ferror(fp)){ puts(er); break; } if(e == ' '){ kolslov++; } }while(!feof(fp)); safe = malloc(kolslov * sizeof(char*)); for(i=0;i<20;i++){ safe[i] = malloc(30*sizeof(char)); } // +++++++podschet slov+++++++++++++++++++ do{ e = getc(fp); if(ferror(fp)){ puts(er); break; } if(e == ' '){ kolslov++; } }while(!feof(fp)); //+++++++++++++++++++++++++++++++++++++++++ do{ e = getc(fp); if(ferror(fp)) { puts(er); break; } if(e != ' ') { safe[sl][sm] = e; sm++; } else{ sl++; sm = 0; } }while(!feof(fp)); printf("%d", kolslov); puts(safe[2]); getch(); return 0; }
извиняюсь перепутал
вместо
e = getc(fp);
e = fgetc(fp);
и еще один вопрос!При считывании с файла символов(после подсчета количества слов в тексте) необходимо использовать rewind(fp)???чтобы потом опять считать символы во втором цикле do{}while()??
Заранее спасибо
Решение задачи: «Выполнить считывание и заполнение массива строк из заданного текстового файла»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> int main() { typedef char TWord[30]; static const char CFileName[] = "1.txt"; FILE* f = fopen(CFileName, "r"); TWord buff; TWord* array; size_t count; size_t i; if (f == NULL) { perror(CFileName); system("pause"); return EXIT_FAILURE; } for (count = 0; fgets(buff, sizeof(TWord), f) != NULL; ++count) { ; } array = (TWord*) malloc(sizeof(TWord) * count); rewind(f); for (i = 0; fgets(array[i], sizeof(TWord), f) != NULL; ++i) { ; } fclose(f); for (i = 0; i < count; ++i) { printf("%s", array[i]); } printf("\n"); free(array); system("pause"); return EXIT_SUCCESS; }
Объяснение кода листинга программы
- Подключение необходимых библиотек для работы с файлами и памятью
- Объявление типа данных TWord, представляющего строку из 30 символов
- Указание имени файла для чтения
- Открытие файла на чтение
- Создание буфера для хранения строки
- Создание указателя на массив строк
- Создание переменной для подсчета количества строк в файле
- Чтение файла построчно с помощью функции fgets до тех пор, пока не встретится пустая строка или не закончится файл
- Выделение памяти под массив строк
- Переход к началу файла с помощью функции rewind
- Заполнение массива строк с помощью функции fgets
- Закрытие файла
- Вывод содержимого массива строк на экран
- Освобождение памяти, выделенной под массив строк
- Ожидание нажатия клавиши для завершения работы программы
- Возврат успешного завершения программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д