# C++ Textdatei  zeilenweise einlesen und in String Array schreiben



## Freeze89 (3. März 2012)

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 :

```
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):

```
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


----------



## sheel (3. März 2012)

Hi und Willkommen bei tutorials.de,

ist Filmname groß genug (Stringlänge- _und_ anzahl)?
Ist das getline die Problemstelle oder eine andere Zeile (Debugger)?


----------



## Freeze89 (3. März 2012)

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


----------



## sheel (3. März 2012)

Willst du mal den ganzen Code zeigen?


----------



## Freeze89 (3. März 2012)

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..


```
#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;
}
```


----------



## deepthroat (4. März 2012)

Hi.





Freeze89 hat gesagt.:


> ```
> ifstream b;  // Datei-Handle
> b.open("Filme.txt", ios::in); // Öffne Datei aus Parameter
> i=0;
> ...


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).

```
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ß


----------



## Freeze89 (5. März 2012)

Wie würde das denn richtig aussehen?
Und Filmname[] gibt es doch siehe Zeile 14.
Oder muss ich was anders machen?


----------



## ibafluss (5. März 2012)

Filmname gibt es zwar, jedoch hat das Array nur 10 Elemente -> Index von 0 - 9.


----------



## deepthroat (6. März 2012)

Du mußt sicherstellen, das nicht über die Arraygrenzen hinaus zugreifst:

```
i = 0;
while (i < n && getline(b, Filmname[i])) {
  ++i;
}
```
Gruß


----------



## Freeze89 (11. März 2012)

Danke für eure hilfe! Hab übersehn das ich auf Filmname[10] zugreife, das nicht exestiert.
Probelm gelöst


----------

