115 lines
4.6 KiB
C
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
|
|
}
|
|
|