Antwort mit KI erzeugt
Portable Anymap C-Programm schreiben
Um das vorgegebene Ziel zu erreichen, müssen wir das C-Programm um die Fähigkeit erweitern, Dateien im Portable Anymap-Format zu lesen. Das Portable Anymap-Format (PBM, PGM, PPM) ist eine leichte Bildformatfamilie, die in Textdateien (P1, P2, P3 für ASCII-Formate) oder in Binärdateien (P4, P5, P6 für binäre Formate) vorliegen kann. Ihre Einfachheit macht sie ideal für eine Aufgabe dieser Art.
Die Schritte, die erforderlich sind, um die Aufgabe zu erfüllen, umfassen:
1.
Datei öffnen: Zuerst müssen wir die Datei öffnen, die im Kommandozeilenargument angegeben ist.
2.
Datei lesen und analysieren: Anschließend lesen wir die Header-Daten der Datei, um die Breite und Höhe des Bildes zu bestimmen. Die Dateigröße kann durch andere Mittel bestimmt werden, beispielsweise durch das Bewegen des Dateizeigers an das Ende der Datei und dann das Abfragen seiner Position.
3.
Ausgabe der Ergebnisse: Zum Schluss geben wir die gesammelten Daten aus: die Breite und Höhe des Bildes sowie die Dateigröße.
Hier ist der erweiterte Code einschließlich der notwendigen Änderungen, um die Aufgabe zu erfüllen:
c
#include <stdio.h>
int main(int argc, char *argv[])
{
if (argc != 2) {
printf("Falsche Anzahl an Argumenten. Benutzung: ./aufgabe1 <Dateipfad>\n");
return 1;
}
// Datei öffnen
FILE *datei = fopen(argv[1], "rb"); // "rb" für binäres Lesen
if (datei == NULL) {
perror("Fehler beim Öffnen der Datei");
return 1;
}
// Dateigröße bestimmen
fseek(datei, 0, SEEK_END); // Bewegen des Zeigers an das Ende der Datei
long dateigroesse = ftell(datei); // Abfragen der Position, die die Größe darstellt
rewind(datei); // Zurücksetzen des Zeigers auf den Anfang der Datei
int breite, hoehe;
char format[3]; // Zum Speichern des Dateiformats (z.B. P1, P6)
// Einlesen des Formats und der Dimensionen des Bildes
if (fscanf(datei, "%2s", format) == 1) {
// Überlesen von Kommentaren
int c;
do {
while (fgetc(datei) != '\n'); // Zum nächsten Zeilenende gehen
c = fgetc(datei); // Zeichen nach Zeilenumbruch prüfen
ungetc(c, datei); // Zeichen zurück in den Stream legen
} while (c == '#'); // Schleife wiederholen, wenn Zeile mit '#' beginnt
if (fscanf(datei, "%d %d", &breite, &hoehe) != 2) {
printf("Fehler beim Lesen der Bildabmessungen.\n");
fclose(datei);
return 1;
}
} else {
printf("Fehler beim Lesen des Dateiformats.\n");
fclose(datei);
return 1;
}
// Datei schließen
fclose(datei);
printf("Breite: %d \nHoehe: %d \nDateigroesse: %ld Bytes\n", breite, hoehe, dateigroesse);
return 0;
}
Wichtig: Der oben gezeigte Code funktioniert gut für ASCII-basierte Portable Anymap-Formate (P1, P2, P3). Für binäre Formate (P4, P5, P6) benötigt die Parsing-Logik zusätzliche Schritte, da nach dem Format und den Dimensionen binäre Bilddaten folgen, die anders gehandhabt werden müssen. Insbesondere müsste nach den Bildabmessungen und der maximalen Farbintensität (für PGM und PPM) das binäre Raster der Bildpixel gelesen werden.