Esercizio di input/output

di il
6 risposte

Esercizio di input/output

La consegna dell'esercizio è questa:
È stato definito un formato binario di dati per memorizzare numeri interi a 32 bit, che consiste in un numero intero a 32 bit che indica quanti numeri sono presenti nel file, seguito da altrettanti numeri interi a 32 bit. Tutti i numeri sono in little endian.
Ad esempio un file contenente i valori 7, 8 e 9 verrebbe codificato con i seguenti byte (rappresentati in esadecimale nel seguito):
03 00 00 00 07 00 00 00 08 00 00 00 09 00 00 00

La funzione leggininteri() riceve in input il nome di un file come stringa C e deve: aprire il file in lettura in modalità non tradotta (binaria), leggere il primo intero (chiamiamolo n), allocare dinamicamente memoria per n interi, leggere gli n interi, impostare size al valore di n, e ritornare un puntatore alla memoria allocata. Se l’apertura fallisce o se non è possibile leggere tutti gli n interi, ritornare NULL. Ricordarsi comunque di chiudere il file se l’apertura è andata a buon fine.

Io ho scritto queste righe di codice:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int *leggiinteri(const char *filename, size_t *size) {

	FILE *f = fopen(filename, "rb");
	if (f == NULL)
		return NULL;


	if ( fread(size, sizeof(int), 1, f) != 1 ) 
		return NULL;


	int *numbers = calloc(*size, sizeof(int));

	for (size_t i = 0; i < *size; i++) {
		fread(&numbers[i], sizeof(int), 1, f);
	}

	fclose(f);

	return numbers;
}


int main(void) {

	size_t size = 0;

	int *n = leggiinteri("prova.bin", &size);
	
	return 0;
}
Per quanto riguarda le righe di codice mi sento abbastanza sicuro.. però ho una domanda.. siccome non ho mai lavorato con i file sono un po' inesperto. Ho creato un file prova.bin e al suo interno ci ho scritto come nell'esempio della consegna 7 8 9. Non capisco perchè quando va a leggere il file, il programma non funziona.. qualcuno ha capito il mio problema? secondo voi ho sbagliato a scrivere all'interno del file.bin qualcosa?

6 Risposte

  • Re: Esercizio di input/output

    Come hai creato il file prova.bin?
  • Re: Esercizio di input/output

    Ho preso il blocco note e ho scritto all'interno 7 8 9, poi dopo averlo salvato, ho cambiato l'estensione da .txt a .bin
  • Re: Esercizio di input/output

    Non funziona così: il blocco note scrive in modalità testo, non binaria. E modificare l'estensione non serve a niente.
    Un file binario è un dump della memoria, il cui contenuto non è intelleggibile. Ti serve un editor esadecimale, oppure creare il file binario da codice:
    
    	FILE* fi = fopen("prova.bin", "wb");
    	if (fi) {
    		int c = 3;
    		int a = 7;
    		int b = 8; 
    		int d = 9;
    	
    		fwrite(&c, sizeof(int), 1, fi);
    		fwrite(&a, sizeof(int), 1, fi);
    		fwrite(&b, sizeof(int), 1, fi);
    		fwrite(&d, sizeof(int), 1, fi);
    		fclose(fi);
    	}
    
    P.S.
    Controlla bene la funzione legginteri() perché c'è un punto in cui non chiudi il file.
  • Re: Esercizio di input/output

    Se scelgo l'altra strada che editor esadecimale mi servirebbe?
  • Re: Esercizio di input/output

    Puoi usare questo:
    http://www.chmaas.handshake.de/delphi/freeware/xvi32/xvi32.htm
  • Re: Esercizio di input/output

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