ifstream.... hab mir das laden grad irgendwie zerschossen



  • Halli Hallo...
    schreib grad nen programm und naja...das laden hat eeeben noch funktioniert...bis ich einiges umgändert habe...und ich finde den fehler einfach nicht!!

    vielleicht findet den einer von euch

    also wenn ich laden mache kommt ne windows meldung:

    die anweisung in 0x0043d8bd verweist auf speicher bla bla bla...der vorgang written konnte nicht im speicher durchgeführt werden xD

    also was is hier falsch...für mich sieht es richtig aus

    #include <iostream>
    #include <fstream>
    #include <conio.h>
    #include <windows.h>
    #include <string.h>
    
    using namespace std;
    
    struct Werte 
    {    char plz[6];
         char ort[40];
    };
    
    class Ort
    {     private: Werte *inhalt;
                   int Anzahlorte;
                   char dateiname[30];
                   ifstream load_file;
                   ofstream save_file;
          public:  Ort(char[]);
                   ~Ort(){};
                   void laden();
                   void anzeigen();
                   void o_suchen();
                   void p_suchen();
                   void speichern();
                   void sortieren();
                   void ende();
    };
    
    Ort::Ort(char neuername[])
    {
         strcpy(dateiname, neuername);      
    }
    
    void Ort::laden()
    {
        ifstream load_file("plz.txt");
         int Anzahl=0;
    
         if (load_file.good() )
         { cout<<"Ihre Daten werden eingelesen"<<endl;
           while (!load_file.eof() )
           {
           load_file>>inhalt[Anzahl].plz;
           load_file>>inhalt[Anzahl].ort;
    
           Anzahlorte = Anzahl;
           Anzahl++;
           }
    
           cout<<Anzahlorte<<" Daten wurden geladen"<<endl;
         }
         else
         { cout<<"Daten konnten nicht geladen werden"<<endl;
         }
    
    }
    
    void Ort::anzeigen()
    {
         for (int i=0; i<=(Anzahlorte-1); i++)
             {
                  cout<<inhalt[i].plz<<"   ";
                  cout<<inhalt[i].ort<<endl;
             }         
    }
    
    void Ort::sortieren()
    {    Werte a;
         int kk;
    
         do
         {kk=1;
    
           for (int i=0; i<=Anzahlorte-1; i++)
           {
    
               if(inhalt[i].ort<inhalt[i+1].ort)
               { a=inhalt[i];
                 inhalt[i]=inhalt[i+1];
                 inhalt[i+1]=a;
                 kk=0;
               }
           }
         }while(kk=0);
    }
    
    void Ort::speichern()
    {  save_file.open("plz.txt");
       for (int i=0; i<=Anzahlorte-1; i++)
       {   save_file<<inhalt[i].plz<<inhalt[i].ort<<'\n';
       }  
       save_file.close();
       cout<<"Ihre Daten wurden gespeichert!"<<endl;
    }
    main()
    {
    
    int wahl=0;
    
    Ort test("plz.txt");
    
    do
    {   cout<<"Bitte waehlen Sie aus"<<endl;
        cout<<"1. laden"<<endl;
        cout<<"2. anzeigen"<<endl;
        cout<<"3. sortieren"<<endl;
        cout<<"4. speichern"<<endl;
        cin>>wahl;
    
        switch(wahl)
        {           case 1: test.laden();
                    break;
                    case 2: test.anzeigen();
                    break;
                    case 3: test.sortieren();
                    break;
                    case 4: test.speichern();
                    break;
                    case 0:
                    break;
                    default: cout<<"\n--------Falsche Eingabe------------";
                    break;
        }
    }
    while(wahl!=0);
    
    getch();
    
    }
    

  • Mod

    Durch fast 150 Zeilen Code wühle ich mich nicht mit solch einer vagen Beschreibung. Aber die Ursache ist dennoch ziemlich offensichtlich: Du mischt wild C und C++ Spachmittel. Und dabei scheinst du dich mit den C Sprachmitteln nicht so besonders gut auszukennen. Wenn man mit den C-Methoden für Zeichenketten und dynamischen Speicher hantiert, dann muss man eben ganz genau wissen, was man tut, sonst passieren genau solche Fehler.

    Abhilfe: Benutze std::string für Zeichenketten und std::vector für dynamische Speicheranforderungen ( ⚠ Jetzt sehe ich auch deinen Fehler (bzw. einen davon): Du benutzt inhalt wie ein dynamisches Array, aber du weist ihm nirgendwo Speicher zu.), dann lösen sich deine Probleme ganz allein.

    Und ein allgemeiner Tipp: Das was du an C++ gelernt hast, ist schlecht. Sehr schlecht. Nicht im Sinne, dass du schlecht gelernt hast, sondern dass der Lehrer selber keine Ahnung hat. Es bietet sich dringend an, den Lehrer/Buch/Kurs zu wechseln.



  • danke dir....ich trüftel mal weiter rum

    Kurs wechseln geht leider nicht,...ich befinde mich auf einer Berufsschule, wo ich das machen muss, was mir vorgekaut wird....



  • Du kannst Dir aber die Mühe machen und mit einem Gutbuch und dem Forum ordentliches C++ lernen, was auch sehr im Sinne der Ausbildung wäre. Und dann von oben herab die Quatschaufgaben machen, also daß Du zwar weißt, wie es ordentlich geht, aber bewußt lehrerkonforme Berufsschulprogrammierung betreibst, und dabei nicht verwirrt wirst. Könnte sogar am Ende wenige Arbeit sein.



  • ja ...kann schon sein...aber wird sicherlich schwer, da im mai schon prüfungen sind und ich sozusagen schon vor ende stehe 😉

    mein sortieren funktioniert auch nicht....das laden geht jetzt aber beim sortieren hängt er einfach nen paar herzchen und smilies dran Oo sonst lässt ers so...



  • och menno schrieb:

    mein sortieren funktioniert auch nicht....das laden geht jetzt aber beim sortieren hängt er einfach nen paar herzchen und smilies dran Oo sonst lässt ers so...

    Wieso schreibst du deine Sortierung überhaupt selber? Und dann auch noch eine Spar-Version von BubbleSort. Da würde ich lieber auf etwas vorgefertigtes zurückgreifen (z.B. std::sort). Und die Inhalte von char-Arrays kannst du nicht mit > miteinander vergleichen.



  • }while(kk=0);
    

    da fehlt garantiert ein =

    Außerdem kann man std::swap zum Tauschen benutzen...



  • #include <vector>
    #include <string>
    #include <iostream>
    #include <fstream>
    #include <algorithm>
    
    /*
        Ob Klasse oder struct ist ziemlich egal, da geht es nur um Zugriffsrechte, aber so
        hast du eine ordentliche struktur. 
    */
    class PostalischerOrt
    {
    public:
        /*
            Der Konstruktor übernimmt die Werte, die die Klasse benötigt und 
            gibt sie in der sog. Initialisierungsliste an die Mitglieder der 
            Klasse weiter.
        */
        PostalischerOrt(int plz, const std::string& ort)
            : m_plz(plz), m_ort(ort)
        {}
    
        // Gibt nur die Plz zurück
        int GetPlz() const { return m_plz; }
    
        // Gibt nur den Ort zurück
        const std::string& GetOrt() const { return m_ort; }
    
        /*
            Vergleicht ein Objekt mit einem anderen Objekt. In diesem Fall wird
            nach PLZ entschieden welches Objekt "größer ist. Man kann das auch mit dem 
            Ort machen.
        */
        bool operator<(const PostalischerOrt& rhs)
        {
            return (GetPlz() < rhs.GetPlz() );
        }
    
    private:
        int m_plz;
        std::string m_ort;
    };
    
    class Orte
    {
        /**
            Der typedef ist in diesem Fall nur ein Alias für den langen Typ. 
            Ein std::vector ist ein Array das in einem Container gekapselt wird. 
            Vorteil: Keine Zugriffsfehler, solange man einige Regeln beachtet
            und vor allem gut zu iterieren ohne irgendwelche Hilfsvariablen 
            bezüglich der Größe.
        */
        typedef std::vector<PostalischerOrt> TVector;    
    public:
        /*
            Der Konstruktor übernimmt den Dateinamen.
        */
        Orte(const std::string& filename)
            : m_filename(filename)
        {}
    
        /*
            Hier wird die Datei geladen. Es gibt übrigens in diesem Fall
            keinen Grund den ifstream in der Klasse als member zu speichern. 
            Du hast in deinem Beispiel eh nicht auf das Member, sondern auf das 
            lokal erzeugte Objekt zugegriffen. 
        */
        bool load()
        {
            std::ifstream stream(m_filename.c_str());
            if ( stream.is_open() && stream.good() )
            {
                std::string ort;
                int plz = 0;
    
                while ( stream.eof() == false )
                {
                    stream >> ort;
                    stream >> plz; // Wie du siehst, geht das auch mit ints.
    
                    // Hier wird das geladene in die Datenstruktur gepackt und in den Container "geworfen".
                    m_content.push_back(PostalischerOrt(plz, ort));
                }
                return true;
            }        
            return false;
        }
    
        /*
            Das solltest du ja kennen 
        */
        bool save()
        {
            std::ofstream stream(m_filename.c_str());
            if ( stream.is_open() && stream.good() )
            {
                TVector::iterator it = m_content.begin();
                for ( it; it != m_content.end(); it++ )
                {
                    PostalischerOrt& ort = *it;
                    stream << ort.GetOrt() << "\n";
                    stream << ort.GetPlz() << "\n";
                }
            }
        }
    
        void display()
        {
            TVector::iterator it = m_content.begin();
            std::cout << "| Ort\t|   Plz\t" << std::endl;
            std::cout << "-----------------------------" << std::endl;
            for ( it; it != m_content.end(); it++ )
            {
                PostalischerOrt& ort = *it;
                std::cout << "| " << ort.GetPlz() << "\t|   " << ort.GetOrt()<< std::endl;
            }
        }
    
        void sort()
        {
            std::sort(m_content.begin(), m_content.end());
        }
    
    private:
        std::string m_filename;
        TVector m_content;
    
    };
    
    int main()
    {
        Orte o("db.txt");
        o.load();
        o.sort();
        o.display();
    }
    

    Werf ein wenig google an zu den Dingen und frage wenn du was nicht verstehst. Aber das wäre in MEINEN Augen ein besserer Weg und vor allem C++.

    Verwendete Datei:

    Fuerth
    90763
    Muenchen
    80156
    

    Ausgabe:

    | Ort	|   Plz	
    -----------------------------
    | 80156	|   Muenchen
    | 90763	|   Fuerth
    


  • danke dir!

    Ich finde es erschreckend, dass uns gesagt wird wir lernen C++ und in wirklichkeit wird uns zusammengewürfelter Müll beigebracht 😞

    naja letztendlich habe ich mein Programm hingekriegt...es funktioniert alles
    aber wird wohl nicht optimal sein, da es aus zusammengewürfeltem aus der schule besteht.


Anmelden zum Antworten