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