Anomalia all'exe di un programma di C con gcc.(linux centOS)

di Anonimizzato13124 il
16 risposte
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?

16 Risposte

  • Il file test.dat esiste? In quale directory è salvato?
  • In realtà il file test non esiste a priori ma lo dovrebbe generare dopo la compilazione del programma.
    Cio che non capisco è perche su xubuntu funziona mentre la no..
  • No, se il file non esiste e lo apri per la lettura hai quell'errore.

    Il compilatore non crea il file dei dati, non gli importa nulla del file dei dati.

    Probabilmente sull'altro sistema il file dei dati esisteva già.
    Copia quel file nel nuovo sistema.
  • Quindi mi dite di creare un file test.dat in formato testo , metterlo nello stesso percorso del filesorgente.c e provare ad eseguire?
    In quel modo dovrebbe anche funzionare su centOS?
  • Fai prima a farlo che a scriverlo per attendere risposta ...

    E comunque, scusa, ma mi sembra ovvio che se dici ad un programma (in qualsiasi linguaggio) di aprire un file in lettura il file *deve* esistere.
  • Non capisco perche su xubuntu dove il file non preesisteva (sono sicuro al cento per cento) non mi ha dato i stessi problemi che su linux CentOS ?
  • O il file esisteva o usavi un altro codice ...
  • Stesso codice e il file non esisteva...
  • Se qualcuno ha magari la possibilità di provare sul linux centOS ve ne sarei grato , io purtroppo non posso più
  • Daniele, è come dice Oregon, il parametro "r" richiede che il file esista altrimenti è impossibile che possa essere aperto in sola lettura, come è logico aspettarsi..
    Io uso Fedora e non avendo alcun file test.dat ottengo il tuo stesso risultato
  • Quindi devo aprire un fil testo chiamarlo test.dat e e poi far partire il programma??
  • daniele90 ha scritto:


    Quindi devo aprire un fil testo chiamarlo test.dat e e poi far partire il programma??
    Ma io che ti avevo scritto? Tu insisti che il file c'era e il codice era lo stesso ...
  • Ho fatto ciò che voi mi avevate dire di fare , cioè creare prima di eseguire il programma il file test.dat ,ma non è cambiato proprio nulla..
  • .
Devi accedere o registrarti per scrivere nel forum
16 risposte