Stamapare su files una lista concatenata di strutture

di il
20 risposte

20 Risposte - Pagina 2

  • Re: Stamapare su files una lista concatenata di strutture

    L'archivio creato non è portable, sia per compilatori differenti sia per il sistema a 32/64
  • Re: Stamapare su files una lista concatenata di strutture

    In alternativa, ho provato a scrivere i singoli elementi di ogni struttura. Questo è il codice:
    
    struct comp
    {
        int code;
        char name[25];
        char des[100];
        int disp;
        struct comp *n;
    };
    
    struct comp *comps = 0;
    int totc = 0;
    
    void apri()
    {
        char *path = malloc(sizeof(char) * 50);
        int ch, i = 0;
        FILE *fr;
        struct comp *p, *c, *nn;
    
        fprintf(stderr, "\nInserisci il percorso e il nome del file: ");
    
        fflush(stdin);
        while((ch = getc(stdin)) != '\n' && i < 256)
        {
            path[i++] = ch;
        }
        path[i] = '\0';
    
        totc = 0;
        if(fr = fopen(path, "r"))
        {
            int ch, i = 0;
    
            //------------------------------------------------
            p = 0;
            c = comps;
            char v[10];
    
            fscanf(fr, "%i%*c", nn->code);
    
            ch = getc(fr);
            while(ch != '\n' && ch != 1)
            {
                nn->name[i++] = ch;
                ch = getc(fr);
            }
            nn->name[i] = '\0';
    
            ch = getc(fr);
            while(ch != '\n' && ch != 1)
            {
                nn->des[i++] = ch;
                ch = getc(fr);
            }
            nn->des[i] = '\0';
    
            fscanf(fr, "%i%*c", &nn->disp);
    
            nn->n = c;
            comps = nn;
            totc++;
            //------------------------------------------------
    
            while(feof(fr) == 0)
            {
                fscanf(fr, "%i%*c", &nn->code);
    
                ch = getc(fr);
                while(ch != '\n' && ch != 1)
                {
                    nn->name[i++] = ch;
                    ch = getc(fr);
                }
                nn->name[i] = '\0';
    
                ch = getchar();
                while(ch != '\n' && ch != 1)
                {
                    nn->des[i++] = ch;
                    ch = getc(fr);
                }
                nn->des[i] = '\0';
    
                fscanf(fr, "%i%*c", &nn->disp);
    
                nn->n = c;
                p->n = nn;
                totc++;
            }
        }
        fclose(fr);
        fflush(NULL);
    }
    
    void salva()
    {
    char *path = malloc(sizeof(char) * 50);
        int ch, i = 0;
        FILE *fw;
        struct comp *p;
    
        fprintf(stderr, "\nInserisci il percorso e il nome del file: ");
    
        fflush(stdin);
        while((ch = getc(stdin)) != '\n' && i < 256)
        {
            path[i++] = ch;
        }
        path[i] = '\0';
    
        if(fw = fopen(path, "w"))
        {
            for(p = comps; p; p = p->n)
            {
                fwrite(&p->code, sizeof(int), 1, fw);
                fputc(1, fw);
                fwrite(p->name, sizeof(char), strlen(p->name), fw);
                fputc(1, fw);;
                fwrite(p->des, sizeof(char), strlen(p->des), fw);
                fputc(1, fw);
                fwrite(&p->disp, sizeof(int), 1, fw);
                fputc('\n', fw);
            }
        }
        fclose(fw);
        fflush(NULL);
    }
    
    Restituisce errore nella lettura.
  • Re: Stamapare su files una lista concatenata di strutture

    Posta il codice completo
  • Re: Stamapare su files una lista concatenata di strutture

    Il codice delle funzioni è completo.
    Codice atttuale:
    
    struct comp
    {
        int code;
        char name[25];
        char des[100];
        int disp;
        struct comp *n;
    };
    
    struct comp *comps = 0;
    int totc = 0;
    
    void apri()
    {
        char *path = malloc(sizeof(char) * 50);
        int ch, i = 0;
        FILE *fr;
        struct comp *p, *c, *nn = malloc(sizeof(struct comp));
    
        fprintf(stderr, "\nInserisci il percorso e il nome del file: ");
    
        fflush(stdin);
        while((ch = getc(stdin)) != '\n' && i < 256)
        {
            path[i++] = ch;
        }
        path[i] = '\0';
    
        totc = 0;
        if(fr = fopen(path, "rb"))
        {
            int ch, i = 0;
    
            //------------------------------------------------
            p = 0;
            c = comps;
    
            fread(&nn->code, sizeof(int), 1, fr);
    
            getc(fr);
    
            ch = getc(fr);
            while(ch != '\n' && ch != 1)
            {
                nn->name[i++] = ch;
                ch = getc(fr);
            }
            nn->name[i] = '\0';
    
            i = 0;
            ch = getc(fr);
            while(ch != '\n' && ch != 1)
            {
                nn->des[i++] = ch;
                ch = getc(fr);
            }
            nn->des[i] = '\0';
    
            fread(&nn->code, sizeof(int), 1, fr);
    
            getc(fr);
    
            nn->n = c;
            comps = nn;
            totc++;
            //------------------------------------------------
    
            while(feof(fr) == 0)
            {
                nn = malloc(sizeof(struct comp));
    
                fread(&nn->code, sizeof(int), 1, fr);
    
            getc(fr);
    
            ch = getc(fr);
            while(ch != '\n' && ch != 1)
            {
                nn->name[i++] = ch;
                ch = getc(fr);
            }
            nn->name[i] = '\0';
    
            i = 0;
            ch = getc(fr);
            while(ch != '\n' && ch != 1)
            {
                nn->des[i++] = ch;
                ch = getc(fr);
            }
            nn->des[i] = '\0';
    
            fread(&nn->code, sizeof(int), 1, fr);
    
            getc(fr);
    
            nn->n = c;
            p->n = nn;
            totc++;
            }
        }
        fclose(fr);
        fflush(NULL);
    }
    
    void salva()
    {
        char *path = malloc(sizeof(char) * 50);
        int ch, i = 0;
        FILE *fw;
        struct comp *p;
    
        fprintf(stderr, "\nInserisci il percorso e il nome del file: ");
    
        fflush(stdin);
        while((ch = getc(stdin)) != '\n' && i < 256)
        {
            path[i++] = ch;
        }
        path[i] = '\0';
    
        if(fw = fopen(path, "wb"))
        {
            for(p = comps; p; p = p->n)
            {
                fwrite(&p->code, sizeof(int), 1, fw);
                fputc(1, fw);
                fwrite(p->name, sizeof(char), strlen(p->name), fw);
                fputc(1, fw);
                fwrite(p->des, sizeof(char), strlen(p->des), fw);
                fputc(1, fw);
                fwrite(&p->disp, sizeof(int), 1, fw);
                fputc('\n', fw);
            }
        }
        fclose(fw);
        fflush(NULL);
    }
    
    Ancora qualche problema nella lettura: ho scritto tre strutture collegate in un file; dopo la lettura della seconda il programma restituisce un errore.
  • Re: Stamapare su files una lista concatenata di strutture

    posta il codice completo
    Se non mi alleghi il resto del codice posso immaginare tutto e niente.
    Questo perchè nella funzione salva vengono scritti i dati della struttura separati da un '\1', dopo disp un '\n'... ma se questa è la logica non viene rispettata nella funzione apri, dove, dopo code, scarti il separatore '\1' (a che serve allora?) e poi cerchi '\n' come terminatore di name e dest...
    Il file binario viene rappresentato come in figura. (in questo tracciato gli interi sono 4 byte).
    
    00000000  03 00 00 00 01 6e 61 6d  65 33 01 64 65 73 33 01  |.....name3.des3.|
    00000010  1e 00 00 00 0a 02 00 00  00 01 6e 61 6d 65 32 01  |..........name2.|
    00000020  64 65 73 32 01 14 00 00  00 0a 01 00 00 00 01 6e  |des2...........n|
    00000030  61 6d 65 31 01 64 65 73  31 01 0a 00 00 00 0a     |ame1.des1......|
    
    Ora io non so se tu vai a mettere un '\n' nel nome e nella descrizione...

    Se è un casino postare l'intero codice, impara ad 'vedere' quello che scrivi e successivamente quello che leggi perchè da quello che vedo qui la cosa non quadra
  • Re: Stamapare su files una lista concatenata di strutture

    Ho risolto. Ecco il codice completo:
    
    struct comp
    {
        int code;
        char name[27];
        char des[102];
        int disp;
        struct comp *n;
    };
    
    struct comp *comps = 0;
    
    void apri()
    {
        char *path = malloc(sizeof(char) * 256);
        int ch, i = 0;
        FILE *fr;
        struct comp *nn = calloc(1, sizeof(struct comp)), *p = 0;
    
        fputs("\nInserisci il percorso e il nome del file: ", stderr);
    
        fflush(stdin);
        while((ch = getc(stdin)) != '\n' && i < 256)
        {
            path[i++] = ch;
        }
        path[i] = '\0';
    
        if((fr = fopen(path, "rb")) != NULL)
        {
            comps = nn;
    
            //-----------------------------------------------------------------   prima struttura
            fread(&nn->code, sizeof(int), 1, fr);
    
            i = 0;
            ch = getc(fr);
            do
            {
                nn->name[i++] = ch;
                ch = getc(fr);
            }
            while(ch != '\0');
    
            i = 0;
            ch = getc(fr);
            do
            {
                nn->des[i++] = ch;
                ch = getc(fr);
            }
            while(ch != '\0');
    
            fread(&nn->disp, sizeof(int), 1, fr);
    
            getc(fr);
    
            p = nn;
            nn = calloc(1, sizeof(struct comp));
            //-----------------------------------------------------------------   fine prima struttura
    
            while((ch = getc(fr)) && (!feof(fr)) && ungetc(ch, fr))
            {
                fread(&nn->code, sizeof(int), 1, fr);
    
                i = 0;
                ch = getc(fr);
                do
                {
                    nn->name[i++] = ch;
                    ch = getc(fr);
                }
                while(ch != '\0');
    
                i = 0;
                ch = getc(fr);
                do
                {
                    nn->des[i++] = ch;
                    ch = getc(fr);
                }
                while(ch != '\0');
    
                fread(&nn->disp, sizeof(int), 1, fr);
    
                getc(fr);
    
                p->n = nn;
                p = nn;
                nn = calloc(1, sizeof(struct comp));
            }
            p->n = 0;
        }
    
        fclose(fr);
        free(path);
        free(nn);
    }
    
    void salva()
    {
        char *path = malloc(sizeof(char) * 256);
        int ch, i = 0;
        FILE *fw;
        struct comp *p;
    
        fputs("\nInserisci il percorso e il nome del file: ", stderr);
    
        fflush(stdin);
        while((ch = getc(stdin)) != '\n' && i < 256)
        {
            path[i++] = ch;
        }
        path[i] = '\0';
    
        if((fw = fopen(path, "wb")) != NULL)
        {
            for(p = comps; p; p = p->n)
            {
                fwrite(&p->code, sizeof(int), 1, fw);
                fwrite(p->name, sizeof(char), strlen(p->name), fw);
                fputc('\0', fw);
                fwrite(p->des, sizeof(char), strlen(p->des), fw);
                fputc('\0', fw);
                fwrite(&p->disp, sizeof(int), 1, fw);
                fputc('\n', fw);
            }
        }
    
        fclose(fw);
        free(path);
    }
    
    Grazie a tutti per il vostro aiuto.
Devi accedere o registrarti per scrivere nel forum
20 risposte