From 2c768550f3461363783589b2ef3c1f274acc61f1 Mon Sep 17 00:00:00 2001 From: Thomas Schleicher Date: Tue, 19 Sep 2023 13:04:34 +0200 Subject: [PATCH] Ready to rumble --- image.c | 46 +++++++++++++++++++++++++++++++++++----------- image.h | 2 ++ main.c | 2 +- matrix.c | 2 +- 4 files changed, 39 insertions(+), 13 deletions(-) diff --git a/image.c b/image.c index e0af441..42c32ba 100644 --- a/image.c +++ b/image.c @@ -6,34 +6,58 @@ #include "image.h" #include "matrix.h" +int endian_swap(int input) { + return ((input >> 24) & 0xff) | // move byte 3 to byte 0 + ((input << 8) & 0xff0000) | // move byte 1 to byte 2 + ((input >> 8) & 0xff00) | // move byte 2 to byte 1 + ((input << 24) & 0xff000000); // byte 0 to byte 3 +} + +int validate_files(FILE* image_file, FILE* label_file) { + + // read magic number from files + int magic_number_label, magic_number_images; + fread(&magic_number_label, 4, 1, label_file); + fread(&magic_number_images, 4, 1, image_file); + + // compare magic numbers with pre-defined value + if(endian_swap(magic_number_label) != 2049 || endian_swap(magic_number_images) != 2051) { + return 0; + } + + return 1; +} + Image** import_images(char* image_file_string, char* label_file_string, int number_of_images) { // create file pointer for the image and label data - FILE* image_file = fopen(image_file_string, 'r'); - FILE* label_file = fopen(label_file_string, 'r'); + FILE* image_file = fopen(image_file_string, "r"); + FILE* label_file = fopen(label_file_string, "r"); // check if the file could be opened if(image_file == NULL || label_file == NULL) { printf("ERROR: File could not be opened! (import_images)"); + exit(1); } - do { - ch = fgetc(label_file); - printf("%c", ch); + // check magic number of the files + if(validate_files(image_file, label_file)) { + printf("ERROR: File validation failed! (validate_files)"); + exit(1); + } - // Checking if character is not EOF. - // If it is EOF stop reading. - } while (ch != EOF); + + // Jakob Section // allocate memory for the storage of images -// Image** images = malloc(sizeof(Image) * number_of_images); + Image** images = malloc(sizeof(Image) * number_of_images); fclose(image_file); fclose(label_file); } -void img_print (Img* img) { +void img_print (Image* img) { //print the image matrix_print(img->pixel_values); @@ -42,6 +66,6 @@ void img_print (Img* img) { printf("%d", img->image_label); } -void img_free (Img* img) { +void img_free (Image* img) { } diff --git a/image.h b/image.h index 9bbf257..b3f0577 100644 --- a/image.h +++ b/image.h @@ -1,5 +1,7 @@ #pragma once +#include "matrix.h" + typedef struct { Matrix* pixel_values; int image_label; diff --git a/main.c b/main.c index d21096e..82750fe 100644 --- a/main.c +++ b/main.c @@ -5,6 +5,6 @@ #include "image.h" int main() { - Image** images = import_images("train-images.idx3-ubyte", "train-labels.idx3-ubyte", 20); + Image** images = import_images("../data/train-images.idx3-ubyte", "../data/train-labels.idx1-ubyte", 20); } \ No newline at end of file diff --git a/matrix.c b/matrix.c index 7954e59..b229631 100644 --- a/matrix.c +++ b/matrix.c @@ -265,5 +265,5 @@ Matrix* matrix_flatten(Matrix* matrix, int axis) { else if (axis == 1) result_matrix->numbers[0][i * matrix->columns + j] = matrix->numbers[i][j]; } } - return mat; + return result_matrix; }