Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C] Gestione lista aziendale dinamica prendendo dati da file

    Salve sono uno studente universitario alle prime armi con il linguaggio C. Dato che a breve dovrò sostenere un esame stavo cercando di esercitarmi svolgendo un programma in grado di gestire un archivio di un azienda attraverso una lista dinamica che prende i dati dal file. Il programma dovrà avere le funzioni che permettono di inizializzare la lista con i dati del file, stamparla e effettuare qualche ricerca, il mio problema è che quando compilo ed eseguo, provando ad inizializzare la lista il compilatore mi dice "Segmentation falut (core drumped). Potete aiutarmi? Metto qui sotto i codice
    codice:
    FILE DI HEADER
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    
    #define LUN 11
    #define MAX 10
    #define DIM 20
    #define CAT 2
    
    
    typedef struct{
    
    
        char piva[LUN];
        char r_sociale[DIM];
        char cognome[DIM];
        char nome[DIM];
        char tel[MAX];
        char fax[MAX];
        char email[DIM];
        char categoria[CAT];
        char acquisti_anno[MAX];
    
    
    }data;
    
    
    
    
    struct nodo{
    
    
        data info;
        struct nodo *next;
    
    
    };
    
    
    typedef struct nodo tlista;
    
    
    
    
    tlista *inizializza (char *, tlista*);
    void salva (char *, tlista*);
    void stampa_aziende(tlista*);
    void stampa_a(tlista*);
    tlista *inserisci(tlista*);
    void determina_b(tlista*);
    codice:
    FILE SORGENTE
    
    #include "data.h"
    
    
    int main(){
    
    
        int input;
        tlista *p = NULL;
    
    
        for(;;)
        {
            printf("----------MENU----------\n");
            printf("Scegli qello che vuoi fare.\n");
            printf("1) Inizializza la lista.\n");
            printf("2) Salva.\n");
            printf("3) Visualizzare a schermo RagioneSociale, Cognome, Nome e Tel di tutte le aziende presenti in archivio\n");
            printf("4) Visualizzare a schermo RagioneSociale, Cognome, Nome e Tel delle aziendeappartenenti alla categoria 'A'\n");
            printf("5) Inserire una nuova azienda\n");
            printf("6) Determinare il numero delle aziende che appartengono alla categoria 'B' e che presentano un valore di AcquistiAnno superiore a 100000 €\n");
            //printf("7) ");
            scanf("%d",&input);
    
    
        if (input==1){
    
    
            p=inizializza("archivio.txt",p);
        }
        else if (input==2){
    
    
            salva("archivio.txt",p);
        }
        else if (input==3){
    
    
            stampa_aziende(p);
        }
        else if (input==4){
    
    
            stampa_a(p);
        }
        else if (input==5){
    
    
            p=inserisci(p);
        }/*
        else if (input==6){
    
    
            determina_b(p);
        }*/
        else
        {
            break;
        }
    }
    }
    codice:
    FILE SORGENTE IN CUI IMPLEMENTO LE FUNZIONI
    
    #include "data.h"
    
    
    tlista *inizializza (char *nomefile, tlista *p){
        data elem;
        tlista *newElem;
        FILE *fp;
    
    
            if((fp=open(nomefile,"r"))!=NULL){
                while(fscanf(fp,"%[^\n],%[^\n],%[^\n],%[^\n],%[^\n],%[^\n],%[^\n],%[^\n],%[^\n\n]\n", elem.piva, &(elem.r_sociale), &(elem.cognome), &(elem.nome), &(elem.tel), &(elem.fax), &(elem.email), &(elem.categoria), &(elem.acquisti_anno))!=EOF){
            newElem = (tlista*) malloc (sizeof(tlista));
            newElem->info = elem;
            newElem->next = p;
            p = newElem;
                }
            }else{
                printf("Errore nell'apertura del file.");
                }
                fclose(fp);
            return p;
                }
    
    
    
    
    
    
    void salva (char *nomefile, tlista *p){
        FILE *fp=open(nomefile,"w");
    
    
            while(p!=NULL){
    
    
                fprintf(fp,"%s\n,%s\n,%s\n,%s\n,%s\n,%s\n,%s\n,%s\n,%s\n", p->info.piva, p->info.r_sociale, p->info.cognome, p->info.nome, p->info.tel, p->info.fax, p->info.email, p->info.categoria, p->info.acquisti_anno);
                p=p->next;
            }
            fflush(fp);
            fclose(fp);
    
    
            return;
    }
    
    
    void stampa_aziende(tlista *p){
    
    
        if (p==NULL){
            printf("Lista vuota.\n");
    
    
        }else{
            while(p!=NULL){
                printf("%s\n,%s\n,%s\n,%s\n",p->info.r_sociale, p->info.cognome, p->info.nome, p->info.tel);
                p=p->next;
            }
        }
    }
    
    
    
    
    void stampa_a(tlista *p){
    
    
        if (p==NULL){
            printf("Lista vuota.\n");
        }else{
            while (p!=NULL){
                if (p->info.categoria=="A"){
                    printf("%s\n,%s\n,%s\n,%s\n", p->info.r_sociale, p->info.cognome, p->info.nome, p->info.tel);
                    p=p->next;
                }
            }
        }
    }
    
    
    tlista *inserisci(tlista *p){
    
    
        data agg;
        char piva[LUN];
        char r_sociale[DIM];
        char cognome[DIM];
        char nome[DIM];
        char tel[MAX];
        char fax[MAX];
        char email[DIM];
        char categoria[CAT];
        char acquisti_anno[MAX];
        tlista *p2 = NULL;
    
    
            printf("Inserisci le info del cliente");
            printf("Inserisci la piva");
            scanf("\n%[^\n]", piva);
            strcpy(agg.piva,piva);
    
    
            printf("Inserisci la ragione sociale");
            scanf("\n%[^\n]", r_sociale);
            strcpy(agg.r_sociale, r_sociale);
    
    
            printf("Inserisci il cognome");
            scanf("\n%[^\n]", cognome);
            strcpy(agg.cognome, cognome);
    
    
            printf("Inserisci il nome");
            scanf("\n%[^\n]", nome);
            strcpy(agg.nome, nome);
    
    
            printf("Inserisci il numero di telefono");
            scanf("\n%[^\n]", tel);
            strcpy(agg.tel, tel);
    
    
            printf("Inserisci il fax");
            scanf("\n%[^\n]", fax);
            strcpy(agg.fax, fax);
    
    
            printf("Inserisci l'email");
            scanf("\n%[^\n]", email);
            strcpy(agg.email, email);
    
    
            printf("Inserisci la categoria");
            scanf("\n%[^\n]", categoria);
            strcpy(agg.categoria, categoria);
    
    
    
    
            printf("Inserisci gli acquisti annuali");
            scanf("\n%[^\n]", acquisti_anno);
            strcpy(agg.acquisti_anno, acquisti_anno);
    
    
            if (p!=NULL){
                p2=(tlista*)malloc(sizeof(tlista));
                p2->info=agg;
                p2->next=p;
            }else{
    
    
                p=(tlista*)malloc(sizeof(tlista));
                p->next=NULL;
                p2=p;
            }
            return p2;
    }
    
    FILE archivio.txt
    
    12345678901
    Running s.n.c.
    Russo
    Salvatore
    0901234567
    0901231234
    info@running.it
    A
    8500
    
    
    
    12345678901
    Happening s.r.l.
    Todaro
    Mario
    021234567
    021231234
    info@happening.com
    B
    22750

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Vedo che tutto quello che ti è stato detto su iprogrammatori.it non è servito a molto...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Sto cercando di fare del mio meglio essendo che sono i miei primi programmi in C non mi trovo a mio agio e non capisco ancora molte cose, non ho persone a ui posso chiedere aiuto, quindi se faccio degli errori stupidi o li ripeto piú volte ti prego di capirmi e ti chiedo scusa... Detto questo, non riesco a capire cosa c'è che non va nel programma, se mi puoi dare una mano mi faresti un grande favore..

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Il fatto è che hai un problema simile sull'altro forum ... leggi lì i consigli che ti ho già dato.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Li ho letti piú volte, ma non sono riuscito a risolvere il problema, nell' altro file il token per inserire gli elementi era la virgola, mentre in quest'latro file è il carattere di new line, cosí nella scanf ho utilizzato %[^\n], è un errore?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Perché usi le virgole nella facanf come se ci fossero nel file?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utilizzando %[^\n] non utilizzo il carattere di newline?

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quote Originariamente inviata da GiorgioAveni11 Visualizza il messaggio
    Utilizzando %[^\n] non utilizzo il carattere di newline?
    Le virgole non ci sono quindi non devi utilizzarle.

    Puoi usare tante fscanf, una per campo, per non avere problemi.

    Se esistono veramente 3 linee vuote tra un record e l'altro ne devi tenere conto.

    P.S. Non guardo molto spesso questo forum .... potrei non rispondere velocemente
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Ho modificato la funzione inizializza cosí ma vista la mia inesperienza sono sicuro di aver fatto una stupidaggine, hai qualche consiglio da darmi ?

    codice:
    tlista *inizializza (char *nomefile, tlista *p){
        data elem;
        tlista *newElem;
        FILE *fp;
    
    
            if((fp=open(nomefile,"r"))!=NULL){
                while(!feof(fp)){
                    fscanf(fp,"%[^\n]", elem.r_sociale);
                    fscanf(fp,"%[^\n]", elem.cognome);
                    fscanf(fp,"%[^\n]", elem.nome);
                    fscanf(fp,"%[^\n]", elem.tel);
                    fscanf(fp,"%[^\n]", elem.fax);
                    fscanf(fp,"%[^\n]", elem.email);
                    fscanf(fp,"%[^\n]", elem.categoria);
                    fscanf(fp,"%[^\n \n]", elem.acquisti_anno);
    
    
            newElem = (tlista*) malloc (sizeof(tlista));
            newElem->info = elem;
            newElem->next = p;
            p = newElem;
                }
            }else{
                printf("Errore nell'apertura del file.");
                }
                fclose(fp);
            return p;
                }

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    E le 3 rifhe vuote le salti o no?

    P.S. non dai un po' di debugging? Non controlli il contenuto delle variabili durante la lettura per capire se qualcosa non va e dove? Bisogna anche sapere cosa fare per individuare gli errori e correggerli ... il tuo IDE non prevede breakpoint?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.