Projekt 2: "Animierte ASCII-Kunst"

3. Filmdaten zeilenweise auslesen

Worum geht es? 

Nachdem die Filmdatei im letzten Teil zum Lesen geöffnet wurde, wird sie in diesem Teil zeilenweise ausgelesen und der Inhalt in einer passenden Datenstruktur abgelegt. 

Nach Abschluss des Einlesevorgangs wird der Filmtitel sowie die Anzahl der Bilder ausgegeben.

Was kannst du danach?

  • Textdatei zeilenweise auslesen
  • Daten in (verschachtelten) Vektoren speichern
  • Teile eines Strings extrahieren


 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;
    
    return 0; 
}