String Spliitern?



  • Hallo ich hoffe ich bin im richtigen Forum :s
    Also mein Problem ist folgendes,wir müssen in der Schule ein Programm schreiben in dem wir unter anderem auch abspeichern und laden müssen,
    Das habe ich soweit auch hinbekommen nur mein Problem ist, beim Laden kann ich die gespeicherten Daten zwar auf der Konsole wieder geben jedoch nicht mit weiter arbeiten o.ä. 😕 jetzt wurde mir gesagt das ich die strings splittern muss und iwie abspeichern aber damit bin ich überfordert 😕 ich hoffe mir kann jemand helfen 😕 ich bin jetzt nicht wirklich ein Profi das wird man sicher merken 😕 also hier ist der code zu speichern und laden :

    void speichern(artikel a[], int n) 
    {
    	if (!n) // kurzschreibweise n = 0
    	{
    		cout << "Es gibt nichts zu speichern." <<endl;
    		return;
    	}
    	ofstream dat; 
    	stringstream ss; 
    
    	char buffer[MAX_PATH]; 
    	string::size_type pos = string(buffer).find_last_of("\\/");
    	std::string path = std::string(buffer).substr(0, pos); 
    	ss << path << "/ARTIKEL.DAT";    
    
    	dat.open(ss.str().c_str());
    
    	for (size_t i = 0; i < n; ++i) 
    	{
        dat << i << ";" << a[i].nr << ";"<< a[i].name << ";" << a[i].preis << ";" << a[i].anzahl<< endl;
    	}
    	dat.close();//datei schließen
    	cout << "Datenbank wurde gespeichert unter " << path << "\\ARTIKEL.DAT." << endl;
    }
    
    void laden (artikel a[], int n)
    {
    stringstream ss;
    char buffer[MAX_PATH];
    GetModuleFileName(NULL, buffer, MAX_PATH);
    string::size_type pos = string(buffer).find_last_of("\\/");
    std::string path = std::string(buffer).substr(0, pos);
    ss << path << "/ARTIKEL.DAT";
    
    std::ifstream Eingabedatei (ss.str().c_str());
    
    if (!Eingabedatei) 
    {
       cout << "\tEs wurden bisher keine Dateien abgespeichert oder, "<<    endl;
       cout << "\t die Ausgangsdatei befindet sich nicht mehr im Zielordner. " << endl;
    }
    
    string line;
    if (Eingabedatei.is_open()) 
    {
      while (getline(Eingabedatei, line)) 
        {
          cout << line << '\n';
        }
        Eingabedatei.close();
    }
    


  • Hallo Kalissi,

    Willkommen im C++-Forum.

    Kalissi schrieb:

    Also mein Problem ist folgendes,wir müssen in der Schule ein Programm schreiben in dem wir unter anderem auch abspeichern und laden müssen,
    Das habe ich soweit auch hinbekommen nur mein Problem ist, beim Laden kann ich die gespeicherten Daten zwar auf der Konsole wieder geben jedoch nicht mit weiter arbeiten o.ä. 😕 jetzt wurde mir gesagt das ich die strings splittern muss ...

    Nein - da ist i.A. ein Holzweg. Besser Du liest gleich die Daten, die Du intern im Programm benötigst. getline ist dem entsprechend die falsche Wahl.

    Das wichtigste hast Du nicht geschrieben:
    - wie sieht der Inhalt der Datei aus?
    - wie ist der Typ artikel definiert?

    Aus

    Kalissi schrieb:

    for (size_t i = 0; i < n; ++i)
        {
        dat << i << ";" << a[i].nr << ";"<< a[i].name << ";" << a[i].preis << ";" << a[i].anzahl<< endl;
        }
    

    schließe ich, dass artikel ungefähr so definiert ist:

    struct artikel {
        int nr;
        std::string name; // ich hoffe std::string und nicht char*
        float preis;
        int anzahl;
    };
    

    Der C++-Weg, um artikel zu schreiben und zu lesen, besteht darin, sogenannte stream inserter, bzw. extractor für artikel zu schreiben. Die Prototypen wären:

    std::ostream& operator<<( std::ostream& out, const artikel& a ); // inserter
    std::istream& operator>>( std::istream& in, artikel& a ); // extractor
    

    dann kannst Du Artikel so schreiben:

    for (size_t i = 0; i < n; ++i)
            dat << a[i];
    

    und so wieder lesen:

    size_t n = 0;
        for( ; n < N && Eingabedatei >> a[n]; ++n ) // N ist maximale Größe des array
            ;
        if( Eingabedatei.eof() )
            cout << "Ok - bis End-Of-File gelesen\n";
        cout << n << " Artikel gelesen" << endl;
    

    Eine sehr einfache Implementierung könnte so aussehen:

    std::ostream& operator<<( std::ostream& out, const artikel& a )
    {
        return out << a.nr << ";"<< a.name << ";" << a.preis << ";" << a.anzahl << std::endl;
    }
    std::istream& operator>>( std::istream& in, artikel& a )
    {
        char semikolon;
        in >> a.nr >> semikolon;
        getline( in, a.name, ';' );
        return in >> a.preis >> semikolon >> a.anzahl;
    }
    

    Gruß
    Werner



  • Hay also erstmal danke für ihre ausführliche antwort :o
    und danke das sie sich die zeit genommen haben 🙂
    Tut mir leid das ich einige sachen Vergessen hab anzugeben nur ich war unsicher was wirklich wichitg ist .. 😞

    ich Denke ich verstehe was sie meinen , nur leider bin ich einfach zu dumm es umzusetzen oder mach iwas flasch denn bei mir werden nur lauter fehlermeldungen angezeigt 😞



  • Kalissi schrieb:

    .. mach iwas flasch denn bei mir werden nur lauter fehlermeldungen angezeigt 😞

    Dann zeig mal deinen gesamten Code und die dazugehörigen Fehlermeldungen (Copy/Paste). So kann dir hier am schnellsten geholfen werden.



  • Kalissi schrieb:

    Hay also erstmal danke für ihre ausführliche antwort :o
    und danke das sie sich die zeit genommen haben 🙂
    Tut mir leid das ich einige sachen Vergessen hab anzugeben nur ich war unsicher was wirklich wichitg ist .. 😞

    ich Denke ich verstehe was sie meinen , nur leider bin ich einfach zu dumm es umzusetzen oder mach iwas flasch denn bei mir werden nur lauter fehlermeldungen angezeigt 😞

    Ich glaube, auch wenn hier manche etwas älter als du(und auch älter als manch anderer;)) sind, sind wir hier doch eine Forengemeinschaft und ein Du ist auch Werner gegenüber Ok.

    ... woebi.. ein Respekt-Sie wäre auch nicht schlecht 😉

    Zu deinem Problem:
    Was Werner meint, ist, dass es schöner wäre, wenn sich deine Artikel-Objekte selbst darum kümmern, wie sie ausgegeben bzw eingelesen werden. D.h. deine beiden Funktionen speichern und laden würden in die Verantwortung der Klasse Artikel gegeben, so dass du dann später sowas hier schreiben kannst:

    std::istream & istr = std::cin; // oder ein anderer Stream, z.B. auf eine Datei
    std::ostream & ostr = std::cout; // oder ein anderer OutputStream, z.B. in eine Datei
    
    Artikel a(/*....*/);
    
    ostr << a << std::endl; // speichert den Artikel a ab
    
    Atrikel b;
    istr >> b; // liest die Daten für Artikel b aus dem Stream
    


  • Also hier ist der komplette Quelltext wie gesagt das ist ziemlich Amateur haft nur bin halt nicht so gut 😕
    ehm und wegen dem sie .. ich du'ze nciht gerne einfach jemanden sondern erst wenn es einem angeboten wird :s
    ich hoffe mit dem kompletten kann mir jemand sagen wie ich was machen muss damit das Programm so funktioniert wie es soll weil eure erklärungen sind eingentlich eindeutig nur sobald ich auf mein Programm dann schaue weiß ich nciht wie ihr das meint 😞
    main hab ich weg gelassen weil da nur die Voids ausgeführt werden und da wirklich ncihts besonderes gemacht wird :o

    [code="cpp"]
    #include <string>
    #include <iostream>
    #include <limits>
    #include <fstream>
    #include <windows.h>
    #include <sstream>
    using namespace std;

    struct artikel
    {
    int nr; // Artikelnummer
    string name; // Artikelbezeichnung
    float preis; // Artikelpreis
    int anzahl; // Artikelanzahl
    };

    artikel* create()

    {
    int artikelnummer, anzahl;
    float preis;
    string name;

    while (1) //(1) bedeutet endlosschleife wenn nötig
    {
    cout << "Artikelnummer: ";
    cin >> artikelnummer;
    if (cin.fail())
    {
    cin.clear();löschen
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cout << "(!) Fehler: Nur ganzzahlige Artikelnummernerlaubt." <<endl;
    continue;
    }
    break; // aus while schleife austreten wenn user gülltige eingabe gemacht hat
    }

    cin.clear(); //eingabe nciht beachten
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cout << "Artikelbezeichnung: ";
    getline(cin, name);

    while (1)
    {
    cout << "Preis: ";
    cin >> preis;//eingabe Preis
    if (cin.fail())
    {
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cout << "(!) Fehler: Nur Dezimalbrueche (ggf. mit Dezimalpunkt) erlaubt." << std::endl;
    continue
    }
    break;
    }

    while (1)
    {
    cout << "Anzahl: ";
    cin >> anzahl;
    if (cin.fail())
    {
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cout << "(!) Fehler: Nur ganzzahlige Anzahlen erlaubt." << endl;
    continue;
    }
    break;
    }

    artikel *a = new artikel();
    a->nr = artikelnummer;
    a->name = name;
    a->preis = preis;
    a->anzahl = anzahl;
    return a; //
    }

    int eingeben(artikel a[], int n)
    {
    if (n < 100) //n max. 99
    { // anzeige wie viele datensätze bisher in der Datenbank sind
    a[n] = *create(); // forderung eines artikel arrays
    cout << "====================================================================" << endl;
    cout << "Neuer Artikel wurde erstellt. Es " << (!n ? "ist" : "sind") << " nun " << (n + 1) << " Artikel in der Datenbank." <<endl;
    cout << "====================================================================" << endl;
    return ++n;
    }
    else
    return n;
    }

    void ausgeben(artikel a[], int n)
    {
    cout << "" << endl;
    for (size_t i = 0; i < n; ++i)
    {
    cout << "Datensatz.........: " << i << endl;
    cout << "Artikelnummer.....: " << a[i].nr << endl;
    cout << "Artikelbezeichnung: " << a[i].name << endl;
    cout << "Preis.............: " << a[i].preis << endl;
    cout << "Anzahl............: " << a[i].anzahl << endl;
    cout << "
    " << endl;
    }
    }

    void speichern(artikel a[], int n)
    {
    if (!n) // kurzschreibweise n = 0
    {
    cout << "Es gibt nichts zu speichern." <<endl;
    return;
    }
    ofstream dat;
    stringstream ss;
    char buffer[MAX_PATH];
    GetModuleFileName(NULL, buffer, MAX_PATH);
    string::size_type pos = string(buffer).find_last_of("\/");

    std::string path = std::string(buffer).substr(0, pos);

    ss << path << "/ARTIKEL.DAT";

    dat.open(ss.str().c_str());

    for (size_t i = 0; i < n; ++i)
    {
    dat << i << ";" << a[i].nr << ";"<< a[i].name << ";" << a[i].preis << ";" << a[i].anzahl<< endl;
    }
    dat.close();//datei schließen
    cout << "Datenbank wurde gespeichert unter " << path << "\\ARTIKEL.DAT." << endl;
    }

    void laden (artikel a[], int n)
    {
    stringstream ss;
    char buffer[MAX_PATH];
    GetModuleFileName(NULL, buffer, MAX_PATH);
    string::size_type pos = string(buffer).find_last_of("\/");
    std::string path = std::string(buffer).substr(0, pos);
    ss << path << "/ARTIKEL.DAT";

    std::ifstream Eingabedatei (ss.str().c_str());

    if (!Eingabedatei)
    {
    cout << "\tEs wurden bisher keine Dateien abgespeichert oder, "<< endl;
    cout << "\tdie Ausgangsdatei befindet sich nicht mehr im Zielordner. " << endl;
    }

    string line;
    if (Eingabedatei.is_open())
    {
    while (getline(Eingabedatei, line))
    {
    cout << line << '\n';
    }
    Eingabedatei.close();
    }

    }



  • Korrektur (korrigierteStellen mit <======= markiert):

    #include <string>
    #include <iostream>
    #include <limits>
    #include <fstream>
    #define NOMINMAX    // <======= #define max unterdrücken
    #include <windows.h>
    #include <sstream>
    using namespace std;
    
    struct artikel
    {
        int nr; // Artikelnummer
        string name; // Artikelbezeichnung
        float preis; // Artikelpreis
        int anzahl; // Artikelanzahl
    };
    
    artikel* create()
    
    {
        int artikelnummer, anzahl;
        float preis;
        string name;
    
        while( 1 ) //(1) bedeutet endlosschleife wenn nötig
        {
            cout << "Artikelnummer: ";
            cin >> artikelnummer;
            if( cin.fail() )
            {
                cin.clear(); // löschen   // <====== kommentar vergessen
                    cin.ignore(numeric_limits<streamsize>::max(), '\n');
                cout << "(!) Fehler: Nur ganzzahlige Artikelnummernerlaubt." << endl;
                continue;
            }
            break; // aus while schleife austreten wenn user gülltige eingabe gemacht hat
        }
    
        cin.clear(); //eingabe nciht beachten
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "Artikelbezeichnung: ";
        getline(cin, name);
    
        while( 1 )
        {
            cout << "Preis: ";
            cin >> preis;//eingabe Preis
            if( cin.fail() )
            {
                cin.clear();
                cin.ignore(numeric_limits<streamsize>::max(), '\n');
                cout << "(!) Fehler: Nur Dezimalbrueche (ggf. mit Dezimalpunkt) erlaubt." << std::endl;
                continue; // <======= ';' vergessen
            }
            break;
        }
    
        while( 1 )
        {
            cout << "Anzahl: ";
            cin >> anzahl;
            if( cin.fail() )
            {
                cin.clear();
                cin.ignore(numeric_limits<streamsize>::max(), '\n');
                cout << "(!) Fehler: Nur ganzzahlige Anzahlen erlaubt." << endl;
                continue;
            }
            break;
        }
    
        artikel *a = new artikel();
        a->nr = artikelnummer;
        a->name = name;
        a->preis = preis;
        a->anzahl = anzahl;
        return a; //
    }
    
    int eingeben(artikel a[], int n)
    {
        if( n < 100 ) //n max. 99
        { // anzeige wie viele datensätze bisher in der Datenbank sind
            a[n] = *create(); // forderung eines artikel arrays
            cout << "====================================================================" << endl;
            cout << "Neuer Artikel wurde erstellt. Es " << ( !n ? "ist" : "sind" ) << " nun " << ( n + 1 ) << " Artikel in der Datenbank." << endl;
            cout << "====================================================================" << endl;
            return ++n;
        }
        else
            return n;
    }
    
    void ausgeben(artikel a[], std::size_t n) // <======== signed/unsigned mismatch n & i
    {
        cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
        for( size_t i = 0; i < n; ++i )
        {
            cout << "Datensatz.........: " << i << endl;
            cout << "Artikelnummer.....: " << a[i].nr << endl;
            cout << "Artikelbezeichnung: " << a[i].name << endl;
            cout << "Preis.............: " << a[i].preis << endl;
            cout << "Anzahl............: " << a[i].anzahl << endl;
            cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;
        }
    }
    
    void speichern(artikel a[], std::size_t n) // <======== signed/unsigned mismatch n & i
    {
        if( !n ) // kurzschreibweise n = 0
        {
            cout << "Es gibt nichts zu speichern." << endl;
            return;
        }
        ofstream dat;
        stringstream ss;
        char buffer[MAX_PATH];
        GetModuleFileName(NULL, buffer, MAX_PATH);
        string::size_type pos = string(buffer).find_last_of("\\/");
    
        std::string path = std::string(buffer).substr(0, pos);
    
        ss << path << "/ARTIKEL.DAT";
    
        dat.open(ss.str().c_str());
    
        for( size_t i = 0; i < n; ++i )
        {
            dat << i << ";" << a[i].nr << ";" << a[i].name << ";" << a[i].preis << ";" << a[i].anzahl << endl;
        }
        dat.close();//datei schließen
        cout << "Datenbank wurde gespeichert unter " << path << "\\ARTIKEL.DAT." << endl;
    }
    
    void laden(artikel a[], int n)
    {
        stringstream ss;
        char buffer[MAX_PATH];
        GetModuleFileName(NULL, buffer, MAX_PATH);
        string::size_type pos = string(buffer).find_last_of("\\/");
        std::string path = std::string(buffer).substr(0, pos);
        ss << path << "/ARTIKEL.DAT";
    
        std::ifstream Eingabedatei(ss.str().c_str());
    
        if( !Eingabedatei )
        {
            cout << "\tEs wurden bisher keine Dateien abgespeichert oder, " << endl;
            cout << "\tdie Ausgangsdatei befindet sich nicht mehr im Zielordner. " << endl;
        }
    
        string line;
        if( Eingabedatei.is_open() )
        {
            while( getline(Eingabedatei, line) )
            {
                cout << line << '\n';
            }
            Eingabedatei.close();
        }
    }
    


  • Oha vielen vielen dank das sie sich so viel mühe gemacht haben :o
    Das Programm geht wieder dank ihrer Hilfe ! 🙂


Anmelden zum Antworten