Посимвольное считывание в структуру - 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(). Вот список действий, которые выполняются в данном коде:

  1. Инициализация начального значения указателя на строку str и счётчика длины строки len равным нулю.
  2. Запуск цикла посимвольного считывания, который выполняется до тех пор, пока не будет достигнут конец файла (т.е. не будет получен символ конца файла — EOF).
  3. В каждой итерации цикла считывается очередной символ из файла с помощью функции fgetc().
  4. Для каждого считанного символа вызывается функция string_append(), которая добавляет его в конец строки.
  5. Если вызов функции string_append() успешен (т.е. память успешно выделена), то обновляется значение указателя на строку str и увеличивается значение счётчика длины строки len.
  6. В случае ошибки при выделении памяти (т.е. если string_append() возвращает NULL) в переменную str записывается значение NULL, а в переменную len записывается значение 0.
  7. После завершения цикла возвращается результат работы функции (считанная строка).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.857 из 5
Похожие ответы