Есть ли различия в реализации файла или списка между OP, потому что мой код работал на Windows, но не на Linux (Mac OS X) - PullRequest
0 голосов
/ 14 июня 2019

Мой код работает на ПК с Windows, но не на Mac OS X. Я уверен, что код правильный или, по крайней мере, этот код работает на Windows.

Мой проект посвящен меню с использованием структуры и файла (добавление точки интереса, добавление комментария, информация о printf), и первоначально я реализовал двоичный файл как функцию, но затем я переписал их в главном, чтобы проверить, изменилось ли что-то


#include <stdio.h>
#include <stdlib.h>
#include <string.h>


//STRUCT WITH POI LIST

typedef struct {
    char title[20];
    char key[5];

} t_poi;

typedef struct _t_nodo_poi {
    t_poi poi;
    struct _t_nodo_poi *next;
}_t_nodo_poi;
typedef  _t_nodo_poi* ptr_nodo_poi;

typedef struct{

    ptr_nodo_poi head;
    ptr_nodo_poi tail;

}t_lista_poi;
typedef t_lista_poi* lista_poi;

//Inizialization of list
lista_poi new_lista_poi() {
    lista_poi new_list = malloc(sizeof (t_lista_poi));
    new_list->head = NULL;
    new_list->tail = NULL;
    return new_list;
}

//READ POI
t_poi read_poi() {

    t_poi poi;
    printf("Title POI: \n");
    scanf(" %[^\n]s\n", poi.title); //NO NUMERI E CARATTERI SPECIALI
    printf("\nDescription POI: \n");
    scanf(" %[^\n]s", poi.key);
    return poi;
}

//INSERT POI IN THE LIST

int insert_poi(lista_poi _lista, t_poi _new_poi) {

    ptr_nodo_poi new_node = (ptr_nodo_poi) malloc(sizeof (_t_nodo_poi));
    if (new_node == NULL)
        return 0;

    new_node->poi = _new_poi;
    new_node->next = NULL;

    if ((_lista)->head == NULL) {

        (_lista)->head = new_node;
        (_lista)->tail = new_node;
    } else {

        (_lista)->tail->next = new_node;
        (_lista)->tail = new_node;
    }
    return 1;
}

//SAVING FILE

void saving_file(lista_poi _lista, FILE * _file) {

    ptr_nodo_poi ptr = _lista->head;
    while(fwrite(&ptr->poi, sizeof(t_poi), 1, _file)) {


        ptr = ptr->next;
        printf("Check");
    }
}




int main(int argc, const char * argv[]) {
    int test,choice,check;
    t_poi new_poi;

    lista_poi _lista_poi;

    _lista_poi = new_lista_poi();

    FILE * file;

    file= fopen("saving", "rb");
    if (file == NULL) {

        printf("Failed");
        exit(1);

    }else{

        while (fread(&new_poi ,sizeof(t_poi),1, file)) {

            insert_poi(_lista_poi,new_poi);

        }
        fclose(file);
}
        do{
        printf("Choice: ");
    scanf("%d",&choice);

        switch (choice) {
            case 1:

                printf("Insert new POI:");
                new_poi = read_poi();
                test = insert_poi(_lista_poi, new_poi);
                if (test == 0)
                    printf("Error memory");
                else
                    printf("Inserted succesfully");


                break;

                case 2:

                printf("Saving on file\n");

                if (_lista_poi->head != NULL) {
                    file = fopen("saving", "wb");
                    printf("\nCheck");

                    if (file==NULL) {

                        printf("\nFailed");
                        exit(1);

                    }else{

                        saving_file(_lista_poi, file);
                        fclose(file);
                    }

                }else
                    printf("List empty!");


                printf("EXIT FROM PROGRAM");

            default:
                break;
        }
 } while (choice != 2);
}

Прямо сейчас это не дает мне никакой ошибки, но и ничего не сохраняет, и когда у меня была загрузка и сохранение файла как функции, это давало мне Исключение о выделенной памяти и указывало на строку, упомянутую в Код.

РЕДАКТИРОВАТЬ: я думаю, теперь вы можете скопировать / вставить ... и, кстати, этот код в Xcode дает мне код выхода 1, говоря, что файл имеет значение NULL

1 Ответ

0 голосов
/ 22 июня 2019

Вы открываете файл дважды:

file= fopen("saving", "rb");

file = fopen("saving", "wb");

Есть несколько вещей, которые вам нужно сделать:

  1. Измените первое значение на file = fopen("saving", "w+b");.

  2. Убрать вторую fopen

  3. Переместить fclose вниз к концу программы

Тогда ваш код должен быть в порядке.

...