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!