0 Daumen
269 Aufrufe

Frage:

Ziel dieser Teilaufgabe ist es ein C-Programm zu entwickeln, das eine Datei im Portable Anymap-Format einlesen kann und die Breite und Höhe des enthaltenen Bildes, sowie die Dateigröße(in Bytes) in der Konsole ausgibt. Der Pfad für die zu lesende Datei soll als Kommandozeilenparameter beim Aufruf übergeben werden. Der Aufruf muss wie folgt aussehen:

./aufgabe1 <Dateipfad>

#include <stdio.h>

int breite;
int hoehe;
long dateigroesse;

int main(int argc, char *argv[])
{
printf("Breite: %d \nHoehe: %d \nDateigroesse: %ld bytes\n",
breite,hoehe,dateigroesse);
return 0;
}

Das ist als Codevorgabe gegeben.

Avatar von

1 Antwort

0 Daumen

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.
Avatar von 4,6 k

Ein anderes Problem?

Stell deine Frage

Ähnliche Fragen

0 Daumen
1 Antwort
0 Daumen
1 Antwort
Gefragt 19 Apr 2018 von Gast

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community