Questa è la consegna:
Creare i file libri.h e libri.c che consentano di utilizzare la seguente struttura:
struct libro {
char *titolo;
uint16_t *anni_ristampe;
};
e la funzione:
extern bool libro_scrivi(const struct libro *p, FILE *f);
La funzione riceve un puntatore ad un elemento di tipo struct libro e deve scriverne i
dati sul file già aperto in modalità scrittura non tradotta (binaria) passato come
parametro. Il titolo viene scritto come sequenza di byte terminata con un ulteriore byte
uguale a 0 come le stringhe C, il campo anni_ristampe punta al primo di una sequenza di
interi senza segno a 16 bit terminata con uno di questi che vale 0. Deve essere scritta
su file in little endian (esattamente come in memoria nei processori Intel). La funzione
ritorna true se tutto va bene, o false se la scrittura fallisce.
Il seguente libro:
struct libro +
| titolo --> "Geometria"
|
| anni_ristampe --> { 2001, 2002, 0 }
Verrebbe scritto su file come:
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 47 65 6F 6D 65 74 72 69 61 00 D1 07 D2 07 00 00 Geometria.Ñ.Ò...
Questo è il mio main:
#include "libri.h"
int main(){
FILE *f = fopen("ibro.bin", "wb");
if (f == NULL){
return EXIT_FAILURE;
}
uint16_t anni[] = { 2001, 2002, 0 };
struct libro l = { "Geometria", &anni};
bool ris = libro_scrivi(&l, f);
return 0;
}
questo è il mio file.h:
#if !defined LIBRI_H
#define LIBRI_H
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<stdint.h>
#include<string.h>
struct libro {
char *titolo;
uint16_t *anni_ristampe;
};
extern bool libro_scrivi(const struct libro *p, FILE *f);
#endif
questo è il mio file.c:
#include "libri.h"
bool libro_scrivi(const struct libro *p, FILE *f){
char *terminatore = malloc(1 * sizeof(char));
terminatore[0] = '\0';
if (fwrite(p->titolo, 1, strlen(p->titolo), f) != strlen(p->titolo)){
return false;
}
if (fwrite(terminatore, 1, 1, f) != 1){
return false;
}
for (size_t i = 0; p->anni_ristampe[i] != '\0'; i++){
while (fwrite(p->anni_ristampe + i, sizeof(uint16_t), 1, f) != 1){
break;
}
}
if (fwrite(terminatore, 1, 1, f) != 1){
return false;
}
free(terminatore);
return true;
}
Non capisco per quale motivo sul file binario non venga scritto niente, qualcuno capisce il perchè?