C: структура списка & fscanf из нескольких файлов - PullRequest
0 голосов
/ 29 сентября 2018

Как проект, я должен прочитать несколько табличных отдельных файлов (содержащих координаты x и y, начиная с 0,0 слева вверху) и сохранить содержимое в динамически распределенном связанном списке.С однократным чтением все нормально, но когда я читаю и пытаюсь добавить элементы второго файла в список, элементы как-то не добавляются.

Может кто-нибудь помочь мне найти причину ошибки икак это исправить?Возможно, я что-то не так делаю с указателями в списке?

Структуры:

typedef enum{
    BLUME=-1, FREI
}belegung;

typedef struct position{
    int zeile;
    int spalte;
    belegung element;
    struct position* next;
}position;

typedef struct feld{
    int zeilen;
    int spalten;
    int anzBlumen;
    position* positionen;
}feld;

Функция для чтения и добавления элементов:

int read(feld* f, char* file){
    FILE* in;
    if((in = fopen(file, "r")) == NULL)
        return -1;


    int count = 0;
    if (f->zeilen == 0 && f->spalten == 0 && f->positionen == NULL)
        count = firstread(in, f);

    else {
        printf("already have flowers\n");
        int a, b;
        int oldS = f->spalten;

        position* ptr = f->positionen; // CAUTION: p = NULL
        while (ptr != NULL) {
            ptr = ptr->next;
            if (ptr != NULL)
                printf("readA: ptr @ %p -> (%d, %d) = %d\n", ptr, ptr->zeile,
                    ptr->spalte, ptr->element);
        }

        // read first line
        if (fscanf(in, "%d\t%d", &a, &b) != EOF) {
            f->zeilen = max(f->zeilen, a);
            f->spalten = oldS + b;
            count++;
        }
        // read first flower


        if (fscanf(in, "%d\t%d", &a, &b) != EOF) {
            ptr = calloc(1, sizeof(position));
            ptr->zeile = a;
            ptr->spalte = b + oldS;
            ptr->element = -1;
            ptr->next = NULL;
            count++;
            printf("Flower: (%d, %d)->(%d, %d) at %p\n", a, b, ptr->zeile,
                    ptr->spalte, ptr);
        }
        // read flower lines
        while (fscanf(in, "%d\t%d", &a, &b) != EOF) {
            ptr->next = calloc(1, sizeof(position));
            ptr = ptr->next;
            ptr->zeile = a;
            ptr->spalte = b + oldS;
            ptr->element = -1;
            ptr->next = NULL;
            printf("Flower: (%d, %d)->(%d, %d) at %p\n", a, b, ptr->zeile,
                    ptr->spalte, ptr);
            count++;
        }

        f->anzBlumen += count - 1;
    }


    printf("Flowerscan done\n");
    // get 'next' to write element in ptr
    preinitFreefeld(f);

    //setFreefeld(f);
    printf("setting up free field done\n");
    fclose(in);
    return count;
}

int firstread(FILE* in, feld* f) {
    int a, b;
    position* p = NULL;

    int count = 0;
    // read first line
    if (fscanf(in, "%d\t%d", &a, &b) != EOF) {
        f->zeilen = a;
        f->spalten = b;
        count++;
    }
    // read first flower
    p = calloc(1, sizeof(position));
    position* ptr = p;
     if (fscanf(in, "%d\t%d", &a, &b) != EOF) {
        ptr->zeile = a;
        ptr->spalte = b;
        ptr->element = BLUME;
        ptr->next = NULL;
        count++;
    }
    f->positionen = p;
    // read flower lines
    while (fscanf(in, "%d\t%d", &a, &b) != EOF) {
        if (ptr->next == NULL)
            ptr->next = calloc(1, sizeof(position));
        ptr = ptr->next;
        ptr->zeile = a;
        ptr->spalte = b;
        ptr->element = BLUME;
        ptr->next = NULL;
        count++;
    }

    f->positionen = p;
    f->anzBlumen = count - 1;
    return count;
}

Пример входного файла:

3   5
2   2
2   3
0   0
0   1
2   4
1   4
0   2

В этом входе первая строка указывает количество строк и строк для использования на экране, следующие строки, в которых элементы расположены с первым номером в строке, являются строкой.или x in (x, y).

Пример вывода:

-1  -1  -1  0   0
0   0   0   0   -1
0   0   -1  -1  -1

1 Ответ

0 голосов
/ 29 сентября 2018

когда я читаю и пытаюсь добавить элементы второго файла в список, элементы как-то не добавляются.

Посмотрите на этот код:

    position* ptr = f->positionen; // CAUTION: p = NULL
    while (ptr != NULL) {
        ptr = ptr->next;
        if (ptr != NULL)
            printf("readA: ptr @ %p -> (%d, %d) = %d\n", ptr, ptr->zeile,
                ptr->spalte, ptr->element);
    }

Здесь вы продолжите, пока ptr не станет NULL.Другими словами ptr больше не указывает на элемент в списке.Вы, вероятно, хотели:

    while (ptr->next != NULL) {

и затем вы хотите добавить новых элементов, используя

        ptr->next = calloc(1, sizeof(position)

Но у вас есть:

    if (fscanf(in, "%d\t%d", &a, &b) != EOF) {
        ptr = calloc(1, sizeof(position));
        ^^^^

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

Я не изучил все детали вашего кода, но я думаю, что выизменить код на что-то вроде:

if (f->positionen == NULL)    // Only check for pointer being NULL
    count = firstread(in, f);

else {
    printf("already have flowers\n");
    int a, b;
    int oldS = f->spalten;

    position* ptr = f->positionen;
    while (ptr->next != NULL) {    // Check for ptr->next
        ptr = ptr->next;
        // if (ptr != NULL)  Delete this line - not needed anymore
            printf("readA: ptr @ %p -> (%d, %d) = %d\n", ptr, ptr->zeile,
                ptr->spalte, ptr->element);
    }

    // read first line
    if (fscanf(in, "%d\t%d", &a, &b) != EOF) {
        f->zeilen = max(f->zeilen, a);
        f->spalten = oldS + b;
        count++;
    }

    // Delete this block - you already have a "first flower"
    // read first flower
    //if (fscanf(in, "%d\t%d", &a, &b) != EOF) {
    //    ptr = calloc(1, sizeof(position));
    //    ptr->zeile = a;
    //    ptr->spalte = b + oldS;
    //    ptr->element = -1;
    //    ptr->next = NULL;
    //    count++;
    //    printf("Flower: (%d, %d)->(%d, %d) at %p\n", a, b, ptr->zeile,
    //            ptr->spalte, ptr);
    //}

    // read flower lines
    while (fscanf(in, "%d\t%d", &a, &b) != EOF) {
        ptr->next = calloc(1, sizeof(position));
        ptr = ptr->next;
        ptr->zeile = a;
        ptr->spalte = b + oldS;
        ptr->element = -1;
        ptr->next = NULL;
        printf("Flower: (%d, %d)->(%d, %d) at %p\n", a, b, ptr->zeile,
                ptr->spalte, ptr);
        count++;
    }

    f->anzBlumen += count - 1;
}
...