115 lines
4.6 KiB
C

//
// Created by z004z80v on 05.11.2025.
//
#define BUFFER_SIZE 100
#define FILE_HEADER_STRING "__info2_image_file_format__"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#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
}