чтение из файла с использованием токенов в различные структуры - PullRequest
0 голосов
/ 31 мая 2018

У меня есть две разные структуры, где following является узлом связанного списка

typedef struct following{
    char nick[6];
    int last_message;
    bool first_time;
    struct following *next;
}following;

typedef struct user{                     
    char nick[6];
    char name[26];
    int n_messages;
    int n_following;
    int n_followers;
    following *arr_following;
    following *arr_unfollowed;
}user;

Я должен заполнить структуру user, читая из файла, подобного этому:

zsq4r Pseu Donym 3 1 2;zero7 2 true!
zero7 James Bond 4 3 3;zsq4r 3 true!zero7 4 false!MrPym 1 true!
MrPym A Perfect Spy 1 3 1;zsq4r 3 true!zero7 4 true!AlecS 1 true!
AlecS He Who Came from the Cold 1 0 1;

Содержимое, разделенное символом ";"должен заполнить структуру user и содержимое, разделенное "!"для заполнения following struct.

Примечание: «вторым» элементом каждой строки файла будет имя пользователя, которое может содержать до 25 символов и может быть разделено пробелом.Например, «Тот, кто пришел с холода» является допустимым именем.

Я попытался заполнить их так:

void read_from_file(hashtable *active_users, FILE *fp_active){
    const char *delimiter1 = "!";
    const char *delimiter2 = ";";
    char *last_token;
    char buffer[1540];
    while(fgets(buffer, 1540, fp_active)) {
        user *new_user = malloc(sizeof(user));
        last_token = strtok( buffer, delimiter2);
        while( last_token != NULL ){
            sscanf(last_token,"%s %[^\n] %d %d %d", new_user->nick, new_user->name, &new_user->n_messages, &new_user->n_following,
                   &new_user->n_followers);
            last_token = strtok( NULL, delimiter1);
        }
        insert(active_users, new_user);
    }
}

Хотя переменная «last_token» содержит правильную частьстроки, считываемой из файла в каждом цикле, я не могу найти, чтобы заполнить обе структуры, поскольку sscanf заполняет только часть структуры user.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 01 июня 2018

Основываясь на советах из комментариев, мне удалось решить мою проблему, изменив аспект файла следующим образом:

zero7;James Bond;2;1;0[MrPym;1;true](zero7;0;false)
MrPym;A Perfect Spy;1;0;1
zsq4r;Pseu Donym;3;1;2[zero7;2;true]
zero7;James Bond;4;3;3[zsq4r;3;true][zero7;3;false][MrPym;1;true]
MrPym;A Perfect Spy;1;3;1[zsq4r;3;true][zero7;4;true][AlecS;1;true]
AlecS;He Who Came from the Cold;1;0;1

И из этого я использовал следующий код для извлечения информации в различныеstructs:

void read_from_file(hashtable *active_users, hashtable *inactive_users, FILE *fp_active, FILE *fp_inactive){
    char m_bool[6];
    char *first_token;
    char *last_token;
    char buffer[1540];
    char buffer2[1540];
    while(fgets(buffer, 1540, fp_active)) {
        strcpy(buffer2, buffer);
        user *new_user = malloc(sizeof(user));
        new_user->arr_following = NULL;
        new_user->arr_unfollowed = NULL;
        last_token = strtok( buffer, "[");
        sscanf(last_token,"%[^;]; %[^;]; %d; %d; %d", new_user->nick, new_user->name, &new_user->n_messages, &new_user->n_following,
               &new_user->n_followers);
        last_token = strtok( NULL, "[");
        while(last_token != NULL){
            following *tmp_following = malloc(sizeof(following));
            sscanf(last_token," %[^;]; %d; %5s", tmp_following->nick, &tmp_following->last_message, m_bool);
            if(strcmp(m_bool, "true]") == 0)
                add(&new_user->arr_following, tmp_following->nick, tmp_following->last_message, true);
            else
                add(&new_user->arr_following, tmp_following->nick, tmp_following->last_message, false);
            last_token = strtok( NULL, "[");
        }
        first_token = strtok( buffer2, ")");
        while(first_token != NULL && strcmp(first_token, buffer2) != 0){
            following *tmp_following = malloc(sizeof(following));
            sscanf(first_token," %[^;]; %d; %5s", tmp_following->nick, &tmp_following->last_message, m_bool);
            if(strcmp(m_bool, "true]") == 0)
                add(&new_user->arr_unfollowed, tmp_following->nick, tmp_following->last_message, true);
            else
                add(&new_user->arr_unfollowed, tmp_following->nick, tmp_following->last_message, false);
            first_token = strtok( NULL, "(");
        }
        insert2(active_users, new_user);
    }
}

Мне пришлось перезапускать строку файла 2 раза для каждой строки, потому что было 3 типа токенов, ; [ (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...