Esercizio C su stringhe strutture e file binario

di il
6 risposte

Esercizio C su stringhe strutture e file binario

Buongiorno a tutti
sto cercando di eseguire l'esercizio di cui inserisco il testo
ho problemi nella lettura delle stringhe che andranno nella struct
ecco il testo:


Creare i file stringhe.h e stringhe.c che consentano di utilizzare la seguente struttura:
struct stringa {
unsigned char length;
char *s;
};
e la funzione:
extern struct stringa *read_stringhe_bin (const char *filename, unsigned int *pn);
La struttura contiene il campo length che contiene la lunghezza della stringa (eventualmente 0) e il
campo s che punta ad una stringa zero terminata (di lunghezza length).
La funzione accetta come parametro un nome di file che deve essere aperto in lettura in modalità
non tradotta (binario) e un puntatore ad una variabile di tipo unsigned int in cui si dovrà inserire il
numero di stringhe presenti nel file. Il file è composto di una sequenza di elementi di lunghezza
variabile in cui un byte indica la lunghezza n della stringa e di seguito ci sono n byte contenenti i
caratteri della stringa.
La funzione deve ritornare un puntatore ad una nuova zona di memoria (allocata dinamicamente
nell’heap) contenente tutte le stringhe lette dal file. Il numero di stringhe non è noto a priori e non
può essere vincolato dal codice. Anche l’elemento s di stringa deve essere allocato dinamicamente
nell’heap.
Ad esempio, un file valido (mostrato come in un editor esadecimale) è:
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 05 43 69 61 6F 21 00 03 61 62 63 0E 50 72 6F 67 .Ciao!..abc.Prog
00000010 72 61 6D 6D 61 7A 69 6F 6E 65 rammazione
Il file contiene una stringa di lunghezza 5 (“Ciao!”), una stringa di lunghezza 0 (“”), una stringa di
lunghezza 3 (“abc”) e una stringa di lunghezza 14 (“Programmazione”). In questo caso la funzione
dovrà impostare la variabile puntata da pn a 4. Per testare la funzione, utilizzare i file stringhe1.bin
e stringhe2.bin disponibili nella pagina dell'esame.




ed ecco come ho interpretato la soluzione:
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <string.h>



struct stringa{
	unsigned char lenght;
	char *s;
};


struct stringa *read_stringhe_bin(const char *filename, unsigned int *pn){
	FILE *f;
	int n = 0;
	*pn = 0;
	struct stringa *v;
	v = malloc(n*sizeof(struct stringa));

	f = fopen(filename, "rb");
	while (!feof(f)){
		n=n+1;
		v = realloc(v, n*sizeof(struct stringa));
		fread(&v[n-1], sizeof(struct stringa), 1, f);



	}


	*pn = n;
	return v;






}


int main(void){
	unsigned int p;
	struct stringa *a;
	char n[] = "stringhe1.bin";
	
	a = read_stringhe_bin(n, &p);

	

	int c = 0;
	for (c = 0; c < p; c++){
		fprintf("%s \n", a->lenght);



	}
	system("pause");
	return 0;

}
grazie anticipatamente per l'aiuto!

6 Risposte

  • Re: Esercizio C su stringhe strutture e file binario

    A parte il testo dell'esercizio e il tuo svolgimento, manca la domanda. Che vuoi sapere?

    Sarà tutto quel "rosso" poco leggibile ...
  • Re: Esercizio C su stringhe strutture e file binario

    Hai ragione scusa il programma si blocca sul printf e facendo il debug ho visto che le i problemi sono nei char *s del mio vettore di struct
  • Re: Esercizio C su stringhe strutture e file binario

    
    Come fai a compilarlo? a me da alcuni errori...
    
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    
    struct stringa
    {
        unsigned char lenght;
        char *s;
    };
    
    
    struct stringa *read_stringhe_bin(const char *filename, unsigned int *pn)
    {
        FILE *f;
        int n = 0;
        *pn = 0;
        struct stringa *v;
        v = (struct stringa*)malloc(n*sizeof(struct stringa));              /**< main.cpp error: invalid conversion from 'void*' to 'stringa*' [-fpermissive]| */
    
        f = fopen(filename, "rb");
        while (!feof(f))
        {
            n=n+1;
            v =(struct stringa*) realloc(v, n*sizeof(struct stringa));      /**< main.cpp error: invalid conversion from 'void*' to 'stringa*' [-fpermissive]| */
            fread(&v[n-1], sizeof(struct stringa), 1, f);
        }
    
        *pn = n;
        return v;
    }
    
    
    int main(void)
    {
        unsigned int p;
        struct stringa *a;
        char n[] = "stringhe1.bin";
        char file_out[] = "stringhe_out.txt";
    
        a = read_stringhe_bin(n, &p);
    
        FILE *f=fopen(file_out,"w+");
    
        unsigned int c = 0;              /**< main.cpp warning: comparison between signed and unsigned integer expressions [-Wsign-compare]| */
        for (c = 0; c < p; c++)
        {
            fprintf(f,"%d \n", a->lenght);      /**< main.cpp error: cannot convert 'const char*' to 'FILE* {aka _iobuf*}' for argument '1' to 'int fprintf(FILE*, const char*, ...)'| */
                                                /**< main.cpp Non puoi stampare un numero con il formato %s (all'inizio mi dava errore, nn ricordo cos'era scritto...) */
        }
    
        fclose(f);
    
        system("pause");
        return 0;
    }
  • Re: Esercizio C su stringhe strutture e file binario

    Poi...
    secondo il testo dell'esercizio nel file sono contenuti char secondo una certa regola, e tu lo stai trattando come un file di strutture...

    devi leggere un byte(che ti indica la lunghezza della parola), reallocare la stringa della struttura, leggere dal file i caratteri che compongono la stringa, aggiungere il carattere '\0' a fine stringa.
    Tutto "while( !feof() )"


    ps: non so voi, ma quel rosso mi crea solo confusione...
  • Re: Esercizio C su stringhe strutture e file binario

    Ok capito...solo una cosa come faccio a leggere solo il primo byte che contiene la lunghezza?
    chiedo scusa ma ho appena iniziato a programmare col c
    io ho pensato cosi
    
    while (!feof(f)){
    		n=n+1;
    		v = realloc(v,n*sizeof(struct stringa));
    		fread(&v[n-1].lenght, sizeof(unsigned char), 1, f);
    		v[n-1].s = malloc(v[n-1].lenght*sizeof(char));
    		fread(&v[n-1].s, sizeof(v[n-1].lenght*sizeof(char)),1, f);
    
    
    	}
    scusate per il rosso volevo differenziare il testo dell'esercizio!
  • Re: Esercizio C su stringhe strutture e file binario

    Benissimo, ma nell'ultimo fread togli il primo sizeof () e lascia solo le istruzioni all'interno.

    sizeof () è una funzione che ritorna la grandezza( espressa in numero di byte) del tipo di dato/ puntatore che gli passi.

    Se stampi alcuni risultati di sizeof() scoprirai che un int occupa 4 byte, un long int 8 byte, un char 1 byte, ecc...

    Quindi se vuoi leggere un byte con la fread () basta che gli passi 1 come secondo parametro. O anche ( come hai fatto tu) "sizeof(unsigned char)"
Devi accedere o registrarti per scrivere nel forum
6 risposte