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

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

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

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

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;
}

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


СОХРАНИТЬ ССЫЛКУ