# Reinspeichern und Rauslesen von Daten eines struct arrays



## cecho (22. März 2012)

Hiho ihr Lieben,

hätte da mal nen Code zur Übung gebastelt der nicht so richtig in der Funktion Textauslesen will...

Wichtig ist halt, dass das Array bei Programmneustart wieder eingelesen und indexiert wird - ausgeben kann ich die Datei auch komplett, aber einzelne Filme z.B. noch nicht aufrufen. Compilieren lässt es sich auch nicht...

Bin auf Linux und compiliere mit g++.

```
#include <cstdlib>
#include <iostream>
#include <string>
#include <fstream>

 
using namespace std;

struct Bluray //Bluray Struktur
    {
    string name;
    int bewertung;
    string beschreibung;
    };



const int maxfilm=10; //Bluray Array
Bluray film[maxfilm];

void bestaetigung(Bluray film); //Prototypen
void Textschreiben(Bluray film);
void Textauslesen();
int readnumber();

main()

{
int Filmanzahl;

Textauslesen(); //Ausgabe der bisherigen Einträge

cout << "Wie viele Filme möchten Sie der Liste hinzufügen? ";
Filmanzahl = readnumber();

int i=0;
for (i=0; i<Filmanzahl; i++)
    {

        cout << endl << "Name : ";
    
    getline(cin, film[i].name);

    cout << endl << "Bewertung: ";

    film[i].bewertung = readnumber();

    cout << endl << "Beschreibung: ";

    getline(cin, film[i].beschreibung);

    Textschreiben(film[i]);
    bestaetigung(film[i]);
    }
}

void bestaetigung(Bluray film) //Bestätigung & Ende des Programmes
{
cout << "Sie haben " << film.name << " mit der Bewertung " << film.bewertung << " und der Beschreibung: ->" << endl << film.beschreibung << endl << "<-erfolgreich hinzugefügt! " << endl;

}

void Textschreiben(Bluray film[i]) //Reinschreiben in die Datei "summe.txt"
{
fstream e;
e.open("summe.txt", ios::out|ios::app);
e << endl << "Name: " << film.name << " Bewertung: " << film.bewertung << " Beschreibung: " << film.beschreibung << "\n";
e.close();
}

void Textauslesen() //komplettes Auslesen und Ausgeben des bisher geschriebenen Textes
{
/*
cout << endl << "Bisherige Einträge: " << endl;
ifstream in("summe.txt");
copy(istreambuf_iterator<char>(in),istreambuf_iterator<char>(),ostreambuf_iterator<char>(cout));
cout << endl;*/

int i=0;
char test[256];

ifstream e;  // Datei-Handle
e.open("summe.txt", ios::in); // Öffne Datei aus Parameter
i=0;
while (e.getline(test, 256, '\n'))
    {          // Solange noch Daten vorliegen
         getline(e, film[i]);
         ++i;
        }
                    e.close();

/*cout << endl << "Found movie at position " << i << endl;

for(i=0; i<maxfilm; i++)
    {
        cout << "Film " << i+1 << " heisst " << film[i] << "\n";
        }
*/
}

int readnumber() //Funktion zum Einlesen und anschließendem Umwandeln einer Zahl

{
string in;
getline(cin, in);
int ergebnis=-1;
ergebnis=atoi(in.c_str());
return ergebnis;
}
```

Danke für jede Hilfe und Verbesserung


----------



## Jennesta (22. März 2012)

Hallo,
bevor ich das lese würde ich mir wünschen, dass du das ordentlich formatierst, denn das ist eine Qual 
Außerdem wäre gut zu wissen warum es nicht kompiliert => Compiler Fehler und Zeile schreiben.

Grüße Jennesta


----------



## cecho (23. März 2012)

Wir haben es so gelernt... Alles was auf einer Ebene ist, wird nicht eingerückt. Oder was genau meinst du?


----------



## vfl_freak (23. März 2012)

Moin,



cecho hat gesagt.:


> Wir haben es so gelernt... Alles was auf einer Ebene ist, wird nicht eingerückt.
> Oder was genau meinst du?


So gelernt? hmm ....

So vielleicht:

```
#include <cstdlib>
#include <iostream>
#include <string>
#include <fstream>
 
 
using namespace std;
 
struct Bluray  //Bluray Struktur
{
    string name;
    int bewertung;
    string beschreibung;
};
 
 
const int maxfilm=10; //Bluray Array
Bluray film[maxfilm];
 
void bestaetigung(Bluray film); //Prototypen
void Textschreiben(Bluray film);
void Textauslesen();
int readnumber();
 
main()
{
    int Filmanzahl;
 
    Textauslesen(); //Ausgabe der bisherigen Einträge
 
    cout << "Wie viele Filme möchten Sie der Liste hinzufügen? ";
    Filmanzahl = readnumber();
 
    int i=0;
    for (i=0; i<Filmanzahl; i++)
    {
        cout << endl << "Name : ";
        getline(cin, film[i].name);
        cout << endl << "Bewertung: ";
        film[i].bewertung = readnumber();
        cout << endl << "Beschreibung: ";
        getline(cin, film[i].beschreibung);
        Textschreiben(film[i]);
        bestaetigung(film[i]);
    }
}
 
void bestaetigung(Bluray film) //Bestätigung & Ende des Programmes
{
    cout << "Sie haben " << film.name << " mit der Bewertung " << film.bewertung << " und der Beschreibung: ->" << endl << film.beschreibung << endl << "<-erfolgreich hinzugefügt! " << endl;
}
 
void Textschreiben(Bluray film[i]) //Reinschreiben in die Datei "summe.txt"
{
    fstream e;
    e.open("summe.txt", ios::out|ios::app);
    e << endl << "Name: " << film.name << " Bewertung: " << film.bewertung << " Beschreibung: " << film.beschreibung << "\n";
    e.close();
}
 
void Textauslesen() //komplettes Auslesen und Ausgeben des bisher geschriebenen Textes
{
    /*
    cout << endl << "Bisherige Einträge: " << endl;
    ifstream in("summe.txt");
    copy(istreambuf_iterator<char>(in),istreambuf_iterator<char>(),ostreambuf_iterator<char>(cout));
    cout << endl;
    */
 
    int i=0;
    char test[256];
 
    ifstream e;  // Datei-Handle
    e.open("summe.txt", ios::in); // Öffne Datei aus Parameter
    i=0;
    while (e.getline(test, 256, '\n'))
    {
        // Solange noch Daten vorliegen
        getline(e, film[i]);
        ++i;
    }
    e.close();
 
    /*
    cout << endl << "Found movie at position " << i << endl;
    for(i=0; i<maxfilm; i++)
    {
        cout << "Film " << i+1 << " heisst " << film[i] << "\n";
    }
    */
}
 
int readnumber() //Funktion zum Einlesen und anschließendem Umwandeln einer Zahl
{
    string in;
    getline(cin, in);
    int ergebnis=-1;
    ergebnis=atoi(in.c_str());
    return ergebnis;
}
```

Gruß
Klaus


----------



## ibafluss (23. März 2012)

Die Übergabe des Parameters in Zeile 53 ist falsch. Wenn du nur ein Bluray-Objekt übergeben willst, übergib einfach so:


```
void Textschreiben (Bluray b)
```

In Zeile 79 übergibst du getline() als 2.Parameter film[i], das ist ein Bluray-Objekt. getline() kann mit diesem nichts anfangen, ich vermute einmal du willst den string des Bluray-Objekts übergeben -> 
	
	
	



```
getline (e, film[i].name
```

Lg


----------

