Посимвольное считывание в структуру - C (СИ)
Формулировка задачи:
Добрый вечер. Необходимо написать программу, которая считывает данные из текстового файла в структуру. В файле занесены данные в следующем порядке:
Перепробовал кучу вариантов, возможно где-то с условиями или циклом напортачил. На данный момент в первую переменную первая строка файла считывается до разделителя, дальше всё сбивается, но в целом хотя бы похоже на то что нужно, во втором же массиве ахинея. Буду благодарен если поможете, не могу понять где ошибка.
Улица, дом, квартира|дата
Соответственно всё что находится до даты надо отправить в один массив, дату в другой. Код:t = 0; k = 0; do { s = fgetc(f_in); // Считывание символа в переменную if ((s != EOF) || (p != EOF)) //Если не конец { if (s == '|') //если разделитель { do { p = fgetc(f_in); //считываем следующий символ if ((p != EOF) || (s != EOF) ) //если не конец { inf.s2[k] = p; //помещаем во второй массив k = k + 1; } } while ((p != '\n') && (p != EOF)); //пока не достигнет конца строки или файла inf.s1[t] = '\n'; t = t + 1; } else inf.s1[t] = s;//иначе помещаем в первый t = t + 1; } } while (s != EOF) ; puts(inf.s1); puts("-----"); puts(inf.s2);
Решение задачи: «Посимвольное считывание в структуру»
textual
Листинг программы
char* string_append(char* str, size_t len, char c) { char* ret = realloc(str, sizeof (char) * (len + 2)); if (ret) { ret[len] = c; ret[len + 1] = '\0'; } return ret; } ... char* str = NULL; size_t len = 0; ... while ((c = fgetc(fp)) != EOF) { ... char* tmp = string_append(str, len, c); if (tmp) { str = tmp; ++len; } ... }
Объяснение кода листинга программы
В данном коде реализован алгоритм посимвольного считывания из файла в строку (или строки) с использованием функции fgetc()
, которая возвращает очередной символ из файла. Для хранения полученной строки используется динамическое выделение памяти с помощью функции realloc()
.
Вот список действий, которые выполняются в данном коде:
- Инициализация начального значения указателя на строку
str
и счётчика длины строкиlen
равным нулю. - Запуск цикла посимвольного считывания, который выполняется до тех пор, пока не будет достигнут конец файла (т.е. не будет получен символ конца файла — EOF).
- В каждой итерации цикла считывается очередной символ из файла с помощью функции
fgetc()
. - Для каждого считанного символа вызывается функция
string_append()
, которая добавляет его в конец строки. - Если вызов функции
string_append()
успешен (т.е. память успешно выделена), то обновляется значение указателя на строкуstr
и увеличивается значение счётчика длины строкиlen
. - В случае ошибки при выделении памяти (т.е. если
string_append()
возвращаетNULL
) в переменнуюstr
записывается значениеNULL
, а в переменнуюlen
записывается значение0
. - После завершения цикла возвращается результат работы функции (считанная строка).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д