stream benutzen



  • Hi Leute,

    ich versuche mich zur Zeit an einer Bibliothek auf der Console.

    Nun möchte ich ein Buch anlegen, also in einer Datei speichern aus der ich es auch wieder aufrufen kann.

    Nur wie stell ich das an ?

    ifstream test("usr.dat",ios::binary);
    if(!test)
    cout<<"Keine Datei gefunden";

    Fehlermeldung// variable `std::ifstream test' has initializer but incomplete type

    und wie lass ich mir später ein bestimmtes Buch anzeigen?

    ich wäre für einige Ratschläge sehr dankbar.

    mfg hild



  • Eigentlich sollte es so funktionieren (davon abgesehen, daß du dem Ctor ein "ios::binary|ios::in" übergeben solltest). Es kann höchstens sein, daß du den falschen Header eingebunden hast - File-Streams findest du in der <fstream>.

    und wie lass ich mir später ein bestimmtes Buch anzeigen?

    per seekg() zur richtigen Position springen und anschließend die nötigen Daten auslesen (op>>, getline(), read,... - je nach Datenformat).

    (oder noch besser - du liest am Anfang alle Bücher in einen vector<Buch> ein und kannst dich dann durch den Speicher hangeln)



  • also ich hab jetzt fstream eingebaut, dachte ja eigentlich das die in iostream mit dabei wäre und bekomm erstma keine fehlermeldung mehr!

    hab momentan noch

    system("PAUSE");
    return EXIT_SUCCESS;

    in der main wirkt sich das eigentlich auch auf andere Funktionen aus, denn nach einer pw abfrage gelag ich zu einem switch wo ich dann die funktion buch_anlegen wähle. Dort steht ein satz und dann öffnet diese dat aber das programm endet sofort nach auswahl der funktion!



  • "system("PAUSE");" wartet einfach nur auf einen Tastendruck*, "return EXIT_SUCCESS;" beendet die main() - und damit auch das komplette Programm. Wenn du irgendwas mit den eingelesenen Büchern machen willst, muß das vorher geschehen.
    (und eventuell solltest du deine komplette Menü+Arbeit Struktur in eine Schleife "do{...}while(eingabe!="ende");" einschließen)

    * in der Konsolen-FAQ findest du übrigens elegantere Methoden, die Konsole beim Programmende offen zu halten.



  • ich hab zwei klassen, bücher und mitglieder, beide sollen in eine liste gespeichert werden also am besten eine datei damit sie auch gespeichert bleiben.

    also in der funktion buch_anlegen()

    erschaffe ich dann die datei via

    ifstream test("usr.dat",ios::binary);

    und wie lege ich jetzt den ersten datensatz an ?

    class buecher
    {
    public:
    char verliehen[10];
    char datum_verleih[10];
    char datum_rueck[10];
    char nummer[5];
    char titel[20];
    char autor[20];
    char kategorie[20];
    char verlag[20];
    char jahrgang[10];
    };



  • Indem du einfach alle Elemente des Buches hintereinander per test>>... einliest (dazu mußt du wissen, in welcher Reihenfolge die Daten in der Datei eingetragen sind).
    Da in der Datei mehrere Bücher stehen können, benötigst du eine Schleife, die bis zum Dateiende liest (while(!test.eof()) und jeden Datensatz per push_back() in deine Liste packt.

    btw solltest du statt der char[]-Elemente lieber std::string verwenden.

    PS: Und bitte öffne die Datei mit "ios::binary|ios::in"



  • ich muss wissen wie die Daten in der Datei eingetragen sind also muss ich vorher die Datei erschaffen, wie mach ich das?

    ok mach ich mit "ios::binary|ios::in" aber warum?
    ich dachte mit diesem befehl erschaffe ich die datei



  • hild schrieb:

    ich muss wissen wie die Daten in der Datei eingetragen sind also muss ich vorher die Datei erschaffen, wie mach ich das?

    Indem du einen ofstream eröffnest und die Daten dort reinschreibst (nachdem du sie von Tastatur abgefragt hast).
    (alternativ kannst du auch den Editor nehmen und die Datei direkt anlegen)

    ok mach ich mit "ios::binary|ios::in" aber warum?
    ich dachte mit diesem befehl erschaffe ich die datei

    Nein, ein ifstream erwartet eine vorhandene Datei und liest die ein - ein ofstream erschafft notfalls eine neue Datei und kann dort etwas reinschreiben.



  • immernoch endet die Konsole ohne das die Funktion sozusagen sichtbar wird.

    void buch_anlegen()
    {char x;
    do{

    cout<<"Neues Buch anlegen"<<endl;

    ifstream test("usrd.dat",ios::in);
    if(!test)
    cout<<"Keine Datei gefunden\n";

    cout<<"Soll eine neue Datei erstellt werden?";
    cout<<" j oder n";
    cin>>x;
    if(x == 'j')
    ofstream datei("usrd.dat",ios::out);

    else
    {
    char y;
    cout<<"Zurück zur Auswahl /n j oder n";
    cin>>y;
    if(y == 'j')
    uebersicht();
    else return;
    }
    }while(x != 1);
    }



  • hier läuft ja nichts schief denk ich .

    switch(zahl){

    case 1:{void eingang();break;}
    case 2:{void ausgang();break;}
    case 3:{void buch_anlegen();break;}
    case 4:{void buch_loeschen();break;}
    case 5:{void mitglied_anlegen();break;}
    case 6:{void mitglied_loeschen();break;}
    case 7:{void mitglied_aendern();break;}
    case 8:{void buecher_sehen();break;}
    case 9:{void mitglieder_sehen();break;}

    }



  • Doch, da sind die "void"s zu viel - du deklarierst jeweils eine lokale Funktion und verlässt den switch().

    (PS: kleiner Tip: mit cpp-Tags sehen deine Code-Beispiele viel schöner aus ;))



  • ok, leider hab ich jetzt ein linkererror
    [Linker error] undefined reference to `eingang()'



  • so leider auch nicht.

    case '1':eingang();break;
    case '2':ausgang();break;



  • Ja, irgendwo brauchst du diese Funktionen ja auch, wenn du sie verwenden willst 😉

    void eingang()
    {
      ...
    }
    //etc.
    

    Dort packst du halt das rein, was du in den jeweiligen Arbeitschritten erledigen willst.

    PS: Bevor du weiter rumstocherst, such dir ein vernünftiges C++ Tutorial und bring dir die Grundlagen der Sprache bei.



  • JA, jetzt seh ich es die buch_anlegen wird garnicht im linker error aufgeführt.

    Kennst du ein paar gute Tutorials ?

    es klappt jetzt ich komm zur anlegen aber ich glaube die do while is nich ganz ok

    while(x != 1); wie sag ich denn das es solange sichtbar bleiben soll ?


Anmelden zum Antworten