From 0ded688dae2dd001ca2ff374f4fac163fe971aaa Mon Sep 17 00:00:00 2001 From: poppni99154 Date: Wed, 26 Nov 2025 22:03:59 +0100 Subject: [PATCH] =?UTF-8?q?Erkl=C3=A4rungen=20zu=20ImageInput=20hinzugef?= =?UTF-8?q?=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- imageInput.c | 72 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 42 insertions(+), 30 deletions(-) diff --git a/imageInput.c b/imageInput.c index e16bef6..8b07c71 100644 --- a/imageInput.c +++ b/imageInput.c @@ -8,69 +8,81 @@ // TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei -//Hilfsfunktion Header prüfen +//Hilfsfunktion Header prüfen, beginnt die mit dem String? static int checkHeader(FILE *file) { - char buffer[100]; - if (fgets(buffer, sizeof(buffer), file) == NULL) - return 0; + const char *erwartet = FILE_HEADER_STRING; //erwarteter String + size_t len = strlen(erwartet); //länge, size_t ist Datentyp - buffer[strcspn(buffer, "\r\n")] = 0; - return strcmp(buffer,FILE_HEADER_STRING ) == 0; + // Platz für genau len Bytes (ohne Nullterminator) + unsigned char buf[BUFFER_SIZE]; //passenden Speicher vorbereiten + if (len > BUFFER_SIZE) return 0; + + // Exakt die länge an Bytes lesen + size_t r = fread(buf, 1, len, file); + if (r != len) return 0; + + // Byteweiser Vergleich + return memcmp(buf, erwartet, len) == 0; //Bitweiser vergleich, strcmp geht nicht } -//Hilfsfkt. 2 Bytes als unsigned short lesen (littel Endian) -static unsigned short readUShort(FILE *file) { - unsigned char bytes[2]; - fread(bytes, 1, 2, file); - return (bytes[1] << 8) | bytes[0]; // Little Endian +//Hilfsfkt. 2 Bytes als unsigned short lesen +static unsigned short read(FILE *file) { + unsigned short value; + if(fread(&value, sizeof(unsigned short), 1, file)!=1) //speichert 2 Bits in value, merkt sich, wo sie aufgehört hat zu lesen + return 0; + return value; } // TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen GrayScaleImageSeries *readImages(const char *path) { - FILE *file = fopen(path, "rb"); + FILE *file = fopen(path, "rb"); //öffnet Datei im Binärmodus if (!file) return NULL; - if (!checkHeader(file)) { + if (!checkHeader(file)) { //beginnt datei mit dem string? fclose(file); return NULL; } - unsigned short count = readUShort(file); - unsigned short width = readUShort(file); - unsigned short height = readUShort(file); + unsigned short count = read(file); //lesen immer 2 Bits aus datei + unsigned short weite = read(file); + unsigned short höhe = read(file); - if (count == 0 || width == 0 || height == 0) { + if (count == 0 || weite == 0 || höhe == 0) { //ist was 0? fclose(file); return NULL; } - GrayScaleImageSeries *series = malloc(sizeof(GrayScaleImageSeries)); + GrayScaleImageSeries *series = malloc(sizeof(GrayScaleImageSeries)); //reserviert Speicher if (!series) { fclose(file); return NULL; } - series->count = count; - series->labels = malloc(count * sizeof(unsigned char)); - series->images = malloc(count * sizeof(GrayScaleImage)); - if (!series->labels || !series->images) { + series->count = count; //auch(*series)count = count; speichert anzahl + series->labels = malloc(count * sizeof(unsigned char)); //speicher bilder + series->images = malloc(count * sizeof(GrayScaleImage)); //speicher für Bildstrukturen + if (!series->labels || !series->images) { //geklappt? fclose(file); free(series->labels); free(series->images); free(series); return NULL; } -for (unsigned int i = 0; i < count; i++) { - GrayScaleImage *img = &series->images[i]; - img->width = width; - img->height = height; - img->buffer = malloc(width * height * sizeof(GrayScalePixelType)); - if (!img->buffer) { +for (unsigned int i = 0; i < count; i++) { //liest alle bilder ein + GrayScaleImage *img = &series->images[i]; //Zeiger auf aktuelles Bild + img->width = weite; //speichert Werte von diesem Bild + img->height = höhe; + + size_t pixels = (size_t)weite * (size_t)höhe; + img->buffer = malloc(pixels * sizeof(GrayScalePixelType)); //speicherwerte für Pixel + + + if (!img->buffer) { //geklappt? fclose(file); clearSeries(series); return NULL; } - if (fread(img->buffer, sizeof(GrayScalePixelType), width * height, file) != width * height) { + if (fread(img->buffer, sizeof(GrayScalePixelType), weite * höhe, file) != weite * höhe) { // liest Pixelwerte aus Datei, speichert in Puffer fclose(file); clearSeries(series); return NULL; @@ -84,7 +96,7 @@ for (unsigned int i = 0; i < count; i++) { } fclose(file); - return series; + return series; //gibt Anzahl, Pixelwerte, labels zurück }