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.