Мой код работает на ПК с 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