#include #include #define N_PIXEL 3072 // 1024 pixel * 3 (R, G, B) // Siccome il char è un byte che rappresenta il valore tra 0 e 255. Per evitare confusioni definisco il tipo "byte" come in Java typedef unsigned char byte; // Singola istanza del dataset. typedef struct { byte categoria; byte immagine[N_PIXEL]; } Istanza; // Questo tipo fornisce il vettore delle istanze e il size (dimensione) del vettore typedef struct { int size; Istanza *istanze; } Dataset; Dataset *get_dataset(char *); // Questo metodo legge il file in questione e restituisce un puntatore a Dataset se il file esiste, altrimenti NULL // Ritorna un puntatore perchè in questo caso posso gestire il ritorno NULL. Dataset *get_dataset(char *path) { Dataset *set = (Dataset *)malloc(sizeof(Dataset)); FILE *file; Istanza istanza; Istanza *istanze = (Istanza *)malloc(sizeof(Istanza)); file = fopen(path, "rb"); if (file == NULL) return NULL; int numero_righe = 0; // Fino a quando questo fread restituisce 1 significa che il file contiene ancora roba while (fread(&istanze[numero_righe].categoria, sizeof(byte), 1, file) == 1) { if (fread(istanze[numero_righe].immagine, sizeof(byte), N_PIXEL, file) == N_PIXEL) { numero_righe++; istanze = (Istanza *)realloc(istanze, sizeof(Istanza) * (numero_righe + 1)); // printf("Caricata nel sistema riga %d\n", numero_righe); } } // Dataset set; (*set).size = numero_righe; (*set).istanze = istanze; fclose(file); return set; } void salva_dataset(const char *filename, Dataset *set) { FILE *file = fopen(filename, "wb"); if (!file) { perror("Errore nell'apertura del file"); exit(EXIT_FAILURE); } for (int indice_istanze = 0; indice_istanze < set->size; indice_istanze++) { fwrite(&set->istanze[indice_istanze].categoria, sizeof(byte), 1, file); fwrite(&set->istanze[indice_istanze].immagine, sizeof(byte), N_PIXEL, file); } fclose(file); } /* void main() { char *path = "cifar-10-batches/data_batch_1.bin"; // Carico il dataset e controllo che non sia nullo Dataset *dataset = get_dataset(path); if (dataset == NULL) { printf("Oggetto dataset nullo\n"); return; } Dataset cavalli; cavalli.size = 1; cavalli.istanze = (Istanza *)malloc(sizeof(Istanza) * cavalli.size); int indice_cavalli = 0; // Lo copio in una seconda variabile per non dover mettere sempre * davanti al nome e libero la memoria occupata dal puntatore Dataset set = *dataset; free(dataset); // Stampa di debug for (int i = 0; i < set.size; i++) { if (set.istanze[i].categoria == 7) { cavalli.size++; cavalli.istanze[indice_cavalli] = set.istanze[i]; cavalli.istanze = (Istanza *)realloc(cavalli.istanze, sizeof(Istanza) * cavalli.size); printf("n: %d. Categoria: %d\n", indice_cavalli, cavalli.istanze[indice_cavalli].categoria); indice_cavalli++; } } salva_dataset("cavalli.bin", &cavalli); } */