Buongiorno a tutti ho provato a compilare il seguente programma sia con xubuntu che con linux centOS:
/*Aggiunge dati in un file,salva i dati, legge i dati da file, cerca dati in un file */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_STR 32
#define FILENAME "test.dat"
struct bib{
char title[MAX_STR];
char author[MAX_STR];
char coll[MAX_STR];
struct bib *next;
};
typedef struct bib bib;
typedef struct bib *bib_p;
bib_p Add_to_list(bib_p begin,char title[],char auth[],char coll[]);
bib_p Add_in_order(bib_p head,char title[],char auth[],char coll[]);
bib_p delete_record(bib_p head, char key[]);
void print_list(bib_p p);
int Save_to_file(bib_p begin,char file_name[]);
int mygetline(char buffer_line[],int);
int Search_in_list(bib_p head,char trial[]);
bib_p Read_from_file(bib_p begin,char file_name[]);
int main()
{
char buffer_title[MAX_STR];
char buffer_name[MAX_STR];
char buffer_coll[MAX_STR];
char line[MAX_STR];
int cont;
char trial[MAX_STR];
int scelta_2;
bib_p head=NULL;
printf("Inserimento dati. . .\n\n");
head=Read_from_file(head,FILENAME);
if(head!=NULL)
{
printf("\nEcco i dati dal file %s:\n\n",FILENAME);
print_list(head);
}
while(cont)
{
printf("\nInserire il titolo dell'opera:\n");
mygetline(buffer_title,MAX_STR);
if(strcmp(buffer_title,"exit")==0)
break;
printf("Inserire l'autore:\n");
mygetline(buffer_name,MAX_STR);
if(strcmp(buffer_name,"exit")==0)
break;
printf("Inserire la collocazione dell'opera:\n");
mygetline(buffer_coll,MAX_STR);
if(strcmp(buffer_coll,"exit")==0)
break;
printf("\n\nPer terminare digitare exit. . .\n\n");
if(strcmp(buffer_title,"")!=0&&strcmp(buffer_name,"")!=0&&strcmp(buffer_coll,"")!=0)
//head=Add_to_list(head,buffer_title,buffer_name,buffer_coll);
head=Add_in_order(head,buffer_title,buffer_name,buffer_coll);
print_list(head);
}
printf("\n\nInserire dati per la ricerca: ");
scanf("%s",trial);
Search_in_list(head,trial);
printf("\nVuoi eliminare il record? 1=si,0=no");
scanf("%d",&scelta_2);
if(scelta_2==0){
printf("\n\nil record e'stato trovato ma non verra' eliminato\n\n");
print_list(head);}
else {
printf("\n Cancello il record trovato:\n\n");
head = delete_record(head, trial);
print_list(head);}
Save_to_file(head,FILENAME);
printf("Indice: \n\n");
print_list(head);
system("pause");
return 0;
}
bib_p Add_to_list(bib_p begin,char title[],char auth[],char coll[])
{
bib_p p;
bib_p curr;
p=(bib*)malloc(sizeof(bib));
strcpy(p->title,title);
strcpy(p->author,auth);
strcpy(p->coll,coll);
p->next=NULL;
if(begin==NULL)
return p;
else
{
curr=begin;
while(curr->next!=NULL)
curr=curr->next;
curr->next=p;
return begin;
}
}
int Save_to_file(bib_p begin,char file_name[])
{
bib_p p;
FILE *fp;
printf("Salvataggio. . .\n\n");
fp=fopen(file_name,"w");
if(fp==NULL)
{
printf("Impossibile aprire in scrittura il file %s. . .\n\n",file_name);
return -1;
}
p=begin;
while(p!=NULL)
{
fwrite(p,sizeof(bib),1,fp);
p=p->next;
}
return 0;
}
bib_p Read_from_file(bib_p begin,char file_name[])
{
bib_p start;
bib bib_item;
FILE *fp;
int n;
start=begin;
fp=fopen(file_name,"r");
if(fp==NULL)
{
printf("Impossibile aprire il file %s in lettura. . .\n\n",file_name);
printf("Nessun archivio importato!!\n\n");
return begin;
}
start=begin;
n=1;
while(n>0)
{
n=fread(&bib_item,sizeof(bib),n,fp);
printf("%d) %4s %4s %4s \1",n,bib_item.title,bib_item.author,bib_item.coll);
if(n>0)
start=Add_to_list(start,bib_item.title,bib_item.author,bib_item.coll);
}
return start;
}
void print_list(bib_p p)
{
if(p!=NULL)
{
printf("\n%4s %4s %4s \n\n",p->title,p->author,p->coll);
p=p->next;
print_list(p);
}
}
int Search_in_list(bib_p head,char trial[])
{
printf("\n\nRicerca elementi in lista...\n");
if(head==NULL)
{
printf("\nImpossibile individuare il percorso specificato\n");
return -1;
}
while(head!=NULL)
{
if(strcmp(head->title,trial)==0||strcmp(head->author,trial)==0||strcmp(head->coll,trial)==0)
{
printf("\n\nElemento trovato!!\n");
return 1;
}
else
printf("Elemento non trovato!!\n\n");
head=head->next;
}
return 0;
}
void insert(bib_p a,bib_p b,bib_p q)
{
if(a->next!=b)
{
printf("Errore nella lista\n\n");
return;
}
a->next=q;
q->next=b;
}
bib_p Add_in_order(bib_p head,char title[],char auth[],char coll[])
{
bib_p p;
bib_p temp;
bib_p temp_pre;
p=(bib_p)malloc(sizeof(bib));
strcpy(p->title,title);
strcpy(p->author,auth);
strcpy(p->coll,coll);
p->next=NULL;
if(head==NULL)
return p;
else
{
if(strcmp(title,head->title)<0)
{
p->next=head;
return p;
}
temp=head;
temp_pre=head;
while(temp!=NULL)
{
if(strcmp(title,temp->title)<0)
{
insert(temp_pre,temp_pre->next,p);
return head;
}
temp_pre=temp;
temp=temp->next;
}
insert(temp_pre,temp_pre->next,p);
return head;
}
}
int mygetline(char buffer_line[],int Max_l)
{
int c,i;
i=0;
while((c=getchar())!='\n'&&i<Max_l)
buffer_line[i++]=c;
buffer_line[i]='\0';
return i;
}
bib_p delete_record(bib_p head, char key[])
{
bib*temp, *prev, *t;
int found =0;
if(head==NULL)
return head;
if(strcmp(head->title,key)==0)
{
temp=head;
head=head->next;
free(temp);
return(head);
}
temp=head->next;
prev= head;
while(temp!= NULL && found ==0)
{
if( strcmp(temp->title,key)==0)
{
found =1;
}
else
{
prev= temp;
temp=temp->next;
}
}
if(found!=0)
{
//il record è presente
prev->next = temp->next;
free(temp);
}
return head;
}
Cio che ho notato di strano è che con xubuntu funziona correttamente , mentre con centOS no in quanto, una volta lanciato , procede cosi
[docente@PC01 Documenti]$ cd /home/docente/Scrivania
[docente@PC01 Scrivania]$ gcc lista.c
[docente@PC01 Scrivania]$ cd/home
bash: cd/home: No such file or directory
[docente@PC01 Scrivania]$ cd /home/docente/Scrivania
[docente@PC01 Scrivania]$ gcc lista.c -o lista -lm
[docente@PC01 Scrivania]$ ./lista
Inserimento dati. . .
Impossibile aprire il file test.dat in lettura. . .
Nessun archivio importato!!
Vuoi effettuare una ricerca?
Quindi mi salta la fase di inserimento dati , sapreste dirmi perche?