// // Created by z004z80v on 05.11.2025. // #define BUFFER_SIZE 100 #define FILE_HEADER_STRING "__info2_image_file_format__" #include #include #include #include "imageInput.h" int main() { char buffer[BUFFER_SIZE]; FILE* file = fopen("mnist_test.info2", "rb"); // 1. Fehlerprüfung beim Öffnen der Datei if (file == NULL) { perror("Fehler beim Öffnen der Datei 'mnist_test.info2'"); return 1; // Fehlercode zurückgeben } // 2. Daten lesen und sichere Null-Terminierung // Lies BUFFER_SIZE - 1 Bytes, um Platz für den Null-Terminator zu lassen size_t bytesRead = fread(buffer, sizeof(char), BUFFER_SIZE - 1, file); buffer[bytesRead] = '\0'; // Null-terminiere an der Stelle, bis zu der gelesen wurde // Optional: Debug-Ausgabe des tatsächlich gelesenen Inhalts printf("DEBUG: Gelesener Puffer (erste %zu Bytes): '%s'\n", bytesRead, buffer); // 3. Header-Vergleich // Stelle sicher, dass genug Daten für den Header gelesen wurden if (bytesRead < strlen(FILE_HEADER_STRING)) { fprintf(stderr, "Fehler: Datei ist zu klein für den Header. Gelesen: %zu Bytes.\n", bytesRead); fclose(file); return 1; } // Verwende strlen für den Vergleich, um genau die Header-Länge zu prüfen if (strncmp(buffer, FILE_HEADER_STRING, strlen(FILE_HEADER_STRING)) != 0) { fprintf(stderr, "Fehler: Dateikopf stimmt nicht überein! Erwartet: '%s'. Gefunden: '%.*s'.\n", FILE_HEADER_STRING, (int)strlen(FILE_HEADER_STRING), buffer); fclose(file); // Datei schließen, bevor das Programm beendet wird return 1; // Fehlercode zurückgeben } // 4. Den numerischen Teil nach dem Header extrahieren und parsen char* dataStart = buffer + strlen(FILE_HEADER_STRING); // Zeiger nach dem Header char* endPtr; // Wird von strtol gesetzt, um das Ende der Zahl zu markieren // Setze errno auf 0, um Überlauf/Unterlauf von strtol zu erkennen errno = 0; // Wichtig: strtol auf 'dataStart' anwenden und Basis '10' verwenden unsigned int headerNumbers = strtol(dataStart, &endPtr, 10); // Fehlerprüfung für strtol if (dataStart == endPtr) { // Keine Ziffern gefunden fprintf(stderr, "Fehler: Konnte keine Header-Zahlen nach dem Dateikopf parsen. Zeichenkette: '%s'\n", dataStart); fclose(file); return 1; } if (errno == ERANGE) { // Zahl zu groß oder zu klein für unsigned int fprintf(stderr, "Fehler: Die geparste Zahl ist außerhalb des gültigen Bereichs für unsigned int.\n"); fclose(file); return 1; } printf("DEBUG: Geparsste Header-Zahl: %u\n", headerNumbers); // Hier kommt deine Logik zur Aufteilung der Header-Zahl GrayScaleImageSeries series; series.images = NULL; // Initialisiere mit NULL, bevor Speicher zugewiesen wird series.count = headerNumbers / 10000; // Dynamische Speicherallokation für die Bilder, wenn series.count > 0 ist if (series.count > 0) { series.images = (GrayScaleImage*)malloc(series.count * sizeof(GrayScaleImage)); if (series.images == NULL) { perror("Fehler bei der Speicherallokation für Bilder"); fclose(file); return 1; } // Annahme: Alle Bilder in der Serie haben die gleiche Größe, die im Header kodiert ist. // Setze die Größe für das erste Bild im Array. // Wenn alle Bilder die gleiche Größe haben, könntest du diese Information auch direkt // in der GrayScaleImageSeries-Struktur speichern, anstatt in jedem einzelnen Bild. series.images[0].width = (headerNumbers / 100) % 100; series.images[0].height = headerNumbers % 100; } else { fprintf(stderr, "Warnung: Serienanzahl ist 0. Keine Bilder zu verarbeiten.\n"); } printf("Series count: %u\n", series.count); // Nur ausgeben, wenn auch Bilder allokiert wurden if (series.count > 0) { printf("Width: %u\n", series.images[0].width); printf("Height: %u\n", series.images[0].height); } else { printf("Width: N/A\n"); printf("Height: N/A\n"); } // 5. Speicher freigeben und Datei schließen if (series.images != NULL) { free(series.images); } fclose(file); return 0; // Erfolgreiche Ausführung }