Выполнить считывание и заполнение массива строк из заданного текстового файла - 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
- Закрытие файла
- Вывод содержимого массива строк на экран
- Освобождение памяти, выделенной под массив строк
- Ожидание нажатия клавиши для завершения работы программы
- Возврат успешного завершения программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д