C++ Textdatei zeilenweise einlesen und in String Array schreiben

Freeze89

Grünschnabel
Guten Tag,
ich habe das Problem das wenn ich eine Textdatei Zeilenweise auslesen möchte mein Programm abstürtzt sobald er zu diesem Part kommt. Mit meiner ersten Variante stürtzte das Programm zwar nicht ab, aber es hat nur bis zum 1. Leerzeichen in das String Array geschrieben. Ich brauche aber die ganze Zeile!
Hier mal mein 1. Versuch :
C++:
ifstream b;  // Datei-Handle
b.open("Filme.txt", ios::in); // Öffne Datei aus Parameter
i=0;
while (b.good()){          // Solange noch Daten vorliegen
                           getline(b, w); 
                           std::stringstream sstr(w);
                           sstr >> Filmname[i];
                           ++i;
                           }
b.close();
Hier mal mein 2. Versuch(wobei das Prog abstürtzt):
C++:
ifstream b;  // Datei-Handle
b.open("Filme.txt", ios::in); // Öffne Datei aus Parameter
i=0;
while (b.good()){          // Solange noch Daten vorliegen
                           getline(b, Filmname[i]);
                           ++i;
                           }
b.close();

Ich bin für jeden Lösungsvorschlag dankbar!
Mfg Freeze89
 
Hi und Willkommen bei tutorials.de,

ist Filmname groß genug (Stringlänge- und anzahl)?
Ist das getline die Problemstelle oder eine andere Zeile (Debugger)?
 
Ja, das String Array ist groß genug!
Im 1. Versuch habe ich in einem Forum(weiß nicht mehr genau welches) gelesen das >> nur bis zum 1. leerzeichen schreibt.
Und im 2. versuch ist Getline das problem bzw wenn ich erst in einen String buffer schreibe und vom buffer dann in das String Array ist diese Anweisung der Fehlerverursacher.
Danke schonmal für die schnelle Antwort
 
Ist zwar etwas wirr weil ich etwas rumprobiert habe, aber egal.
Das prog ist nur zum lernen da. Klappt ja eig auch alles bis auf diese Zeilenauslesen mit Leerzeichen..

C++:
#include <cstdlib>
#include <iostream>
#include <string>
#include<time.h>
#include <fstream>
#include <sstream>
#include<windows.h>

using namespace std;

int anzahl=0;
const int n=10;
int Filme[n];
string Filmname[n];
string beschreibung[n];
int bewertung[n];
int Auswahl;
string w;
int i=0;
int beenden=0;
int Option=0;
int bearbeiten=0;
char test[256];

void Textschreiben(){
                     fstream e;
                     e.open("Anzahl.txt", ios::out);
                     for(i=0; i<n; i++){
                                          e << Filme[i] << endl;
                                          }
                     e.close();
                     fstream f;
                     f.open("Filme.txt", ios::out);
                     for(i=0; i<n; i++){
                                          f << Filmname[i] << endl;
                                          }
                     f.close();
                     fstream g;
                     g.open("Beschreibung.txt", ios::out);
                     for(i=0; i<n; i++){
                                          g << beschreibung[i] << endl;
                                          }
                     g.close();
                     fstream h;
                     h.open("Bewertung.txt", ios::out);
                     for(i=0; i<n; i++){
                                          h << bewertung[i] << endl;
                                          }
                     h.close();
                     }
                     
void Textauslesen(){
                    ifstream a;  // Datei-Handle
                    a.open("Anzahl.txt", ios::in); // Öffne Datei aus Parameter
                    i=0;
                    while (!a.eof()){          // Solange noch Daten vorliegen
                                     getline(a, w); 
                                     std::stringstream sstr(w);
                                     sstr >> Filme[i];
                                     ++i;
                                     }
                    a.close();
                    ifstream b;  // Datei-Handle
                    b.open("Filme.txt", ios::in); // Öffne Datei aus Parameter
                    i=0;
                    while (b.good()){          // Solange noch Daten vorliegen
                                     getline(b, Filmname[i]);
                                     ++i;
                                     }
                    b.close();
                    ifstream c;  // Datei-Handle
                    c.open("Beschreibung.txt", ios::in); // Öffne Datei aus Parameter
                    i=0;
                    while (c.getline(test, sizeof(test))){          // Solange noch Daten vorliegen
                                    getline(c, beschreibung[i]); 
                                    ++i;
                                     }
                    c.close();
                    ifstream d;  // Datei-Handle
                    d.open("Bewertung.txt", ios::in); // Öffne Datei aus Parameter
                    i=0;
                    while (!d.eof()){          // Solange noch Daten vorliegen
                                     getline(d, w); 
                                     std::stringstream sstr(w);
                                     sstr >> bewertung[i];
                                     ++i;
                                     }
                    d.close();
                    i=0;
                    }

int main(int argc, char *argv[])
{
    cout << "Dies ist eine Auflistung meiner Filme!\n";
    cout << "Mit kleinem Info Text worum es in dem Film geht!\n";
    cout << "Und Bewertungssystem von schon gesehenen Filmen!\n";
    Textauslesen();
    for(i=0; i<n; i++){
                            if(Filme[i]==0){
                                            i=10;
                                            }
                            else{
                                 anzahl++;
                                 }
                            }
    cout << "Es sind bis jetzt " << anzahl << " gelistet\n";
    if(anzahl==0){
                  cout << "Du kanst jetzt Filme in die Datenbank eintragen!\n";
                  int eintragen;
                  cout << "Wieviele Filme willst du eintragen?"; cin >> eintragen; cout << "\n";
                  for(i=0; i<eintragen; i++){
                                             Filme[i]=i+1;
                                             cin.ignore(5000, '\n');
                                             cout << "Wie heisst der " << i+1 << " Film?"; getline(cin,Filmname[i]); cout << "\n";
                                          //   cin.ignore(5000, '\n');
                                             cout << "Beschreibung des Filmes?"; getline(cin,beschreibung[i]); cout << "\n";
                                             cout << "Deine Bewertung von 1 bis 5\n";
                                             cout << "Wobei 1 schlecht und 5 Gut entspricht!\n";
                                             cout << "Wenn du den Film noch nicht gesehen hast trage 0 ein!\n"; cin >>bewertung[i]; cout << "\n";  
                                             }
                  }
    for(i=0; i<anzahl; i++){
                       cout << "Film " << i+1 << " heisst " << Filmname[i] << "\n";
                       }
    while(beenden==0){
                      cout << "Du hast folgende Moeglichkeiten!\n";
                      cout << " 1 = Waehle ein Film, um Informationen ueber diesen zu erhalten!\n";
                      cout << " 2 = Trage neue Filme in die Datenbank ein!\n";
                      cout << " 3 = Bearbeite bereits vorhandene Filme!\n";
                      cout << " 4 = Speichern und Beenden!\n";
                      cin >> Option;
                      if(Option==1){
                                    cout << "Ueber welchen Film willst mehr Information?\n";
                                    cout << "Wenn noetig scrolle hoch um die Zahl des Filmes nachzuschauen!\n";
                                    cin >> Auswahl;
                                    cout << "Der Film heisst " << Filmname[Auswahl-1] << " !\n";
                                    cout << "In dem Film geht es um : \n" << beschreibung[Auswahl-1] << "\n";
                                    cout << "Durchschnittliche Bewertung : " << bewertung[Auswahl-1] << "\n";
                                    system("PAUSE");
                                    }
                      if(Option==2){
                                    int neu=anzahl;
                                    cout << "Du kanst jetzt Filme in die Datenbank eintragen!\n";
                                    int eintragen;
                                    cout << "Wieviele Filme willst du eintragen?"; cin >> eintragen; cout << "\n";
                                    for(i=neu; i<(neu+eintragen); i++){
                                                                       Filme[i]=i+1;
                                                                       cin.ignore(5000, '\n');
                                                                       cout << "Wie heisst der " << i+1 << " Film?"; getline(cin,Filmname[i]); cout << "\n";
                                                                       cin.ignore(5000, '\n');
                                                                       cout << "Beschreibung des Filmes?"; getline(cin,beschreibung[i]); cout << "\n";
                                                                       cout << "Deine Bewertung von 1 bis 5\n";
                                                                       cout << "Wobei 1 schlecht und 5 Gut entspricht!\n";
                                                                       cout << "Wenn du den Film noch nicht gesehen hast trage 0 ein!\n"; cin >>bewertung[i]; cout << "\n";  
                                                                       }
                                    }
                      if(Option==3){
                                    cout << "Waehle ein Film den du Bearbeiten moechtest!\n";
                                    cin >> bearbeiten;
                                    cout << "Du moechtest den Film : " << Filmname[bearbeiten-1] << "bearbeiten\n";
                                    cout << " 1 = Filmtitel aendern!\n";
                                    cout << " 2 = Filmbeschreibung aendern!\n";
                                    cout << " 3 = Bewertung loeschen!\n";
                                    }
                      if(Option==4){
                                    cout << "Es wird gespeichert!\n";
                                    beenden=1;
                                    }
                      }
    Textschreiben();
    cout << "Es wurde gespeichert!\n";
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
Zuletzt bearbeitet:
Hi.
C++:
ifstream b;  // Datei-Handle
b.open("Filme.txt", ios::in); // Öffne Datei aus Parameter
i=0;
while (b.good()){          // Solange noch Daten vorliegen
                           getline(b, w); 
...
                           }
Das sollte man so nie tun. So kannst du doch gar nicht wissen, ob überhaupt eine Zeile eingelesen wurde (da du zwar vorher prüfst ob alles "good" ist, aber nicht das Ergebnis von getline selbst).
C++:
while (getline(b, w)) {
  ...
}
Ähnliche Probleme gibt es bei Verwendung von eof, bad, fail.

\edit: Der Absturz kommt übrigens (wie von sheel bereits vermutet) dadurch dass das Stringarray nicht groß genug ist. Du greifst auf Filmname[10] zu, welches nicht existiert.

Gruß
 
Zuletzt bearbeitet:
Wie würde das denn richtig aussehen?
Und Filmname[] gibt es doch siehe Zeile 14.
Oder muss ich was anders machen?
 
Du mußt sicherstellen, das nicht über die Arraygrenzen hinaus zugreifst:
C++:
i = 0;
while (i < n && getline(b, Filmname[i])) {
  ++i;
}
Gruß
 

Neue Beiträge

Zurück