Заполнение массива структуры из файла - PullRequest
0 голосов
/ 27 марта 2019

Очевидно, это очень простая задача, но я до сих пор боролся с ней.

Я инициализирую массив структур. Каждая структура состоит из двух массивов.

Затем я пытаюсь прочитать из файла и заполнить мой массив структур. Файл, составленный из строк, выглядит примерно так:

sign1 path1
sign2 path2
sign3 path3

У меня проблема с заполнением, а затем с печатью моего массива. Любая помощь очень ценится. Спасибо!

typedef struct { 
    char firma[333];
    char path[100];
}riga;

void riempi_riga(riga* r, FILE* f1) {
    //fscanf(f1, "%s %s\n", r->firma, r->path);
    fgets(r->firma, 33, f1);
    fgets(r->path, 100, f1);
    return;
}

void stampa_riga(riga* r) {
    printf("%s %s\n", r->firma, r->path);
    return;
}

int num_lines(FILE *f1) {
    char c;
    int lines = 0;
    while ((c = fgetc(f1)) != EOF)
        if (c == '\n')
            lines++;

    if (c != '\n')
        lines++;
    rewind(f1);
    return lines;
}

int main() {
    riga* file_firme[1000];
    int i = 0;
    int j = 0;
    FILE* f1;

    f1 = fopen("C:\\Users\\blabla\\Desktop\\firmaMD5.txt", "r");
    if (f1 == NULL) {
        printf("non sono riuscito ad aprire il file!\n");
        return 0;
    }

    int num_righe = num_lines(f1);
    for (i; i < num_righe; i++)
        riempi_riga(&file_firme[i], f1);

    //riempi_riga(r1, f1);
    //stampa_riga(r1);
    //fflush(f1);

    for (j; j < num_righe; j++) {
            stampa_riga(&file_firme[j]);
    }

    if (fclose(f1) != 0)
        printf("non sono riuscito a chiudere il file\n");

    return 0;
}

1 Ответ

0 голосов
/ 27 марта 2019

Кажется, ваш ввод в строках sign path, где "знак" и "путь" разделены пробелом. Вы можете прочитать всю строку с помощью fgets, а затем вызвать strtok, чтобы получить два токена. Этот код не проверен.

void riempi_riga(riga* r, FILE* f1) 
{
    char *tok;
    char buf[sizeof(r->firma)+sizeof(r->path)];
    if (fgets(buf, sizeof(buf), f1) != NULL)
    {
        if ((tok = strtok(buf)) != NULL)
        {
            strncpy(r->firma, tok, sizeof(r->firma));
            r->firma[sizeof(r->firma)-1]=0;
            if ((tok = strtok(NULL)) != NULL)
            {
                strncpy(r->path, tok, sizeof(r->path));
                r->path[sizeof(r->path)-1]=0;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...