Problema nella scrittura di un file binario

di il
2 risposte

Problema nella scrittura di un file binario

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è?

2 Risposte

  • Re: Problema nella scrittura di un file binario

    Questa linea deve essere

    struct libro l = { "Geometria", anni};

    Per il resto funziona a parte un paio di dettagli.

    Il terminatore non lo devi allocare come carattere singolo, ma è già presente nella stringa, quindi basta scrivere un carattere in più

    fwrite(p->titolo, 1, strlen(p->titolo)+1, f) != strlen(p->titolo)+1

    E dopo gli anni non va un singolo byte terminatore ma un intero a 16 bit.
    Ovvero devi scrivere il valore 2001 2002 e 0 del vettore di uint16. Non il terminatore che segue.
  • Re: Problema nella scrittura di un file binario

    Ok grazie mille!!
Devi accedere o registrarti per scrivere nel forum
2 risposte