Считать из файла поля структуры, разделенные точкой с запятой - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! Делаю летнюю практику по программировании (1 курс, тема "Электросбыт") и вот что у меня не получается: Есть файл, называется energy.db В нем такие данные 1;476149;1;3;128783;ул. Циолковского д. 21; каждое поле разделено точкой с запятой, первое поле - id человека, второе - номер договора, третье - id фио, четвертое - тарифный план, пятое - показания счетчика, шестое - адрес проживания. мне необходимо считать и записать все это в структуру
Листинг программы
  1. struct Energy
  2. {
  3. int ID;
  4. long Num;
  5. int name;
  6. int NameOfTarif;
  7. long Counter;
  8. char Adress[80];
  9. } *nrg;
Вот в чем собсно проблема - у меня получается нормально считать числа и точки с запятой мне не мешают, а вот когда начинаю считывать адрес (после "ул." идет пробел) scanf обрывается и не хочет дальше считывать. Помогите пожалуйста как обойти это дело, заранее благодарен

Решение задачи: «Считать из файла поля структуры, разделенные точкой с запятой»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. struct Energy
  5. {
  6.     int ID;
  7.     long Num;
  8.     int name;
  9.     int NameOfTarif;
  10.     long Counter;
  11.     char Adress[80];
  12. };
  13.  
  14. int parse(char * s, const char * delim, struct Energy * e) {
  15.     char * p = strtok(s, delim);
  16.     if ( !p || sscanf(p, "%d", &(e->ID)) != 1 )
  17.         return -1;
  18.     if ( ! ( p = strtok(NULL, delim) ) || sscanf(p, "%ld", &(e->Num)) != 1 )
  19.         return -1;
  20.     if ( ! ( p = strtok(NULL, delim) ) || sscanf(p, "%d", &(e->name)) != 1 )
  21.         return -1;
  22.     if ( ! ( p = strtok(NULL, delim) ) || sscanf(p, "%d", &(e->NameOfTarif)) != 1 )
  23.         return -1;
  24.     if ( ! ( p = strtok(NULL, delim) ) || sscanf(p, "%ld", &(e->Counter)) != 1 )
  25.         return -1;
  26.     if ( ! ( p = strtok(NULL, delim) ) || ! strncpy(e->Adress, p, sizeof(e->Adress) - 1) )
  27.         return -1;
  28.    
  29.     return 0;
  30. }
  31.  
  32. int main(void) {
  33.     char str[] = "1;476149;1;3;128783;ul. Ciolkovskogo, d. 21";
  34.     struct Energy se = { 0 };
  35.    
  36.     if ( parse(str, ";", &se) )
  37.         fprintf(stderr, "Parsing error!\n");
  38.     else
  39.         printf("%d\n%ld\n%d\n%d\n%ld\n%s\n", se.ID, se.Num, se.name, se.NameOfTarif, se.Counter, se.Adress);
  40.    
  41.     return 0;
  42. }

Объяснение кода листинга программы

  1. Структура данных Energy объявлена с полями:
    • ID (тип int)
    • Num (тип long)
    • name (тип int)
    • NameOfTarif (тип int)
    • Counter (тип long)
    • Adress (тип char, массив на 80 символов)
  2. Функция parse() принимает строку, разделитель (delim) и указатель на структуру Energy (e).
  3. Используя функцию strtok(), строка разбивается на части по разделителю (delim).
  4. Каждая часть строки обрабатывается с помощью функции sscanf().
    • Первая часть строки (p) считывается как int и сохраняется в поле ID структуры Energy (e).
    • Вторая часть строки (p) считывается как long и сохраняется в поле Num структуры Energy (e).
    • Третья часть строки (p) считывается как int и сохраняется в поле name структуры Energy (e).
    • Четвертая часть строки (p) считывается как int и сохраняется в поле NameOfTarif структуры Energy (e).
    • Пятая часть строки (p) считывается как long и сохраняется в поле Counter структуры Energy (e).
    • Шестая и последняя часть строки (p) считывается как char и сохраняется в поле Adress структуры Energy (e).
  5. Если какая-либо часть строки не может быть считана или скопирована, функция parse() возвращает -1.
  6. В функции main() создается строка str[] с данными для разбора.
  7. Создается структура Energy se = { 0 }.
  8. Если функция parse() вернула неноль, выводится сообщение об ошибке разбора.
  9. В противном случае выводятся значения полей структуры Energy se.
  10. Программа завершается возвратом 0.

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


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

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

8   голосов , оценка 4.125 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы