Считать из файла поля структуры, разделенные точкой с запятой - C (СИ)
Формулировка задачи:
Доброго времени суток!
Делаю летнюю практику по программировании (1 курс, тема "Электросбыт") и вот что у меня не получается:
Есть файл, называется energy.db
В нем такие данные
1;476149;1;3;128783;ул. Циолковского д. 21;
каждое поле разделено точкой с запятой, первое поле - id человека, второе - номер договора, третье - id фио, четвертое - тарифный план, пятое - показания счетчика, шестое - адрес проживания.
мне необходимо считать и записать все это в структуру Вот в чем собсно проблема - у меня получается нормально считать числа и точки с запятой мне не мешают, а вот когда начинаю считывать адрес (после "ул." идет пробел) scanf обрывается и не хочет дальше считывать.
Помогите пожалуйста как обойти это дело, заранее благодарен
struct Energy { int ID; long Num; int name; int NameOfTarif; long Counter; char Adress[80]; } *nrg;
Решение задачи: «Считать из файла поля структуры, разделенные точкой с запятой»
textual
Листинг программы
#include <stdio.h> #include <string.h> struct Energy { int ID; long Num; int name; int NameOfTarif; long Counter; char Adress[80]; }; int parse(char * s, const char * delim, struct Energy * e) { char * p = strtok(s, delim); if ( !p || sscanf(p, "%d", &(e->ID)) != 1 ) return -1; if ( ! ( p = strtok(NULL, delim) ) || sscanf(p, "%ld", &(e->Num)) != 1 ) return -1; if ( ! ( p = strtok(NULL, delim) ) || sscanf(p, "%d", &(e->name)) != 1 ) return -1; if ( ! ( p = strtok(NULL, delim) ) || sscanf(p, "%d", &(e->NameOfTarif)) != 1 ) return -1; if ( ! ( p = strtok(NULL, delim) ) || sscanf(p, "%ld", &(e->Counter)) != 1 ) return -1; if ( ! ( p = strtok(NULL, delim) ) || ! strncpy(e->Adress, p, sizeof(e->Adress) - 1) ) return -1; return 0; } int main(void) { char str[] = "1;476149;1;3;128783;ul. Ciolkovskogo, d. 21"; struct Energy se = { 0 }; if ( parse(str, ";", &se) ) fprintf(stderr, "Parsing error!\n"); else 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); return 0; }
Объяснение кода листинга программы
- Структура данных Energy объявлена с полями:
- ID (тип int)
- Num (тип long)
- name (тип int)
- NameOfTarif (тип int)
- Counter (тип long)
- Adress (тип char, массив на 80 символов)
- Функция parse() принимает строку, разделитель (delim) и указатель на структуру Energy (e).
- Используя функцию strtok(), строка разбивается на части по разделителю (delim).
- Каждая часть строки обрабатывается с помощью функции 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).
- Если какая-либо часть строки не может быть считана или скопирована, функция parse() возвращает -1.
- В функции main() создается строка str[] с данными для разбора.
- Создается структура Energy se = { 0 }.
- Если функция parse() вернула неноль, выводится сообщение об ошибке разбора.
- В противном случае выводятся значения полей структуры Energy se.
- Программа завершается возвратом 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д