Заполнение массива структуры из файла

#c

#c

Вопрос:

По-видимому, это очень простая задача, но я боролся с ней в течение некоторого времени до сих пор.

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

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

 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 %sn", r->firma, r->path);
    fgets(r->firma, 33, f1);
    fgets(r->path, 100, f1);
    return;
}

void stampa_riga(riga* r) {
    printf("%s %sn", 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(amp;file_firme[i], f1);

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

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

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

    return 0;
}
  

Комментарии:

1. while ((c = fgetc(f1)) != EOF) —> fgetc возвращает int . c должно быть int не char

2. Спасибо! но это не решает мою проблему. Пожалуйста, любая дополнительная помощь?

3. «Я получаю свою проблему при заполнении, а затем при печати моего массива» в чем конкретно наша проблема? и, кстати, наличие имен переменных и текста на итальянском языке снижает ясность вопроса.

4. Да. Я знаю. Но с какой проблемой вы столкнулись? Я не вижу ничего плохого в том, что у вас есть. За исключением того, что вы можете захотеть: fgets(r->firma, 333, f1); вместо fgets(r->firma, 33, f1); или лучше: fgets(r->firma, sizeof(r->firmat), f1);

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

Ответ №1:

Кажется, ваш ввод находится в строках 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;
            }
        }
    }
}
  

Комментарии:

1. разве я не мог просто использовать fscanf(f1, «%s %s», r-> firma, r-> path)? в чем отрицательная сторона его использования? %s автоматически останавливается при встрече с пробелом, не так ли?

2. fgets считывает до новой строки. если вы хотите использовать различные функции scanf , я бы предложил fgets plus sscanf . обязательно укажите максимальное количество символов в строке вашего формата %s.