Projekt 2: "Animierte ASCII-Kunst"



4. Filmstatistiken berechnen

Worum geht es? 

Nachdem in den letzten Teilen die Filmdatei zum Lesen und deren Inhalt in einer passende Datenstruktur im Speicher abgelegt wurde, wird nun die Anzahl der Zeilen pro Bild sowie die Gesamtzahl der gespeicherten Zeichen bestimmt. Erstere ist Voraussetzung für die Höhenanpassung des Terminal-Fensters im nächsten Schritt. 

Was kannst du danach?

  • Eine for-Schleife benutzen
  • Auf die Elemente eines verschachtelten Vektors zugreifen

 Der zu öffnende Dateiname kann hier eingegeben werden:

Hinweis: Im Beispiel wurden nur die ersten 5 Bilder verwendet.
Die komplette Datei kann hier heruntergeladen werden.

#include <string>
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main()
{
    // Dateiname einlesen
    string filename;
    cout << "Bitte Filmdatei angeben : ";
    cin >> filename;
    cout << filename << endl;

    // Datei zum Lesen öffnen
    ifstream movie_data(filename);
    if (!movie_data.is_open())
    {
        cout << "Fehler beim Öffnen!" << endl;
        exit(1); // Programm mit Fehlercode beenden
    } else
    {
        cout << "Datei erfolgreich geöffnet!" << endl;
    }
    
    // Datenstrukturen für Filmdaten
    string title;                  // Titel des Films
    string line;                   // eine Zeile
    vector<string> image;          // ein Bild
    vector<vector<string>> images; // eine Bilderserie

    // Filmdaten zeilenweise auslesen
    while (getline(movie_data, line)) // zeilenweise auslesen
    {
        // Titel extrahieren
        if (line[0] == '@') // Markierung für Titel
        {
            title = line.substr(1, line.size() - 1);
        }

        // Aktuelle Zeile in Bild speichern
        if (line[0] == '"') // Markierung für Bilder
        {
            image.push_back(line);
        }

        // Fertiges Bild in Serie speichern
        if (line[0] == ' ' && image.size() > 0)
        {
            images.push_back(image); // Bild in Liste kopieren
            image.clear();           // Bild wieder löschen
        }
    }
    movie_data.close();
    cout << "Filmtitel = " << title << endl;
    cout << "Anzahl Bilder = " << images.size() << endl;
    
    // Filmstatistiken berechnen
    int symbols{0}, lines{0};
    for (int i = 0; i < images.size(); i++)
    {
        // Anzahl Zeilen
        if (images[i].size() > lines)
        {
            lines = images[i].size(); // Maximum speichern
        }

        // Anzahl Zeichen
        for (int j = 0; j < images[i].size(); j++)
        {
            symbols += images[i][j].size();
        }
    }
    cout << "Anzahl Zeilen / Bild = " << lines << endl;
    cout << "Anzahl Zeichen = " << symbols << endl;
    
    return 0; 
}

Die Datei mit dem Namen "datei1.txt" ist auf dem Server vorhanden. Verändere den Dateinamen im Eingabefeld und achte auf die Ausgabe des Programms.