Text zeilenweise aus datei (vllt noch nicht vorhanden) auslesen und zeilenweise wieder reinschreiben



  • Also.

    Mein programm hat eine wxcombobox.

    beim start des programms moechte ich das es aus einer datei(C:\test.txt) jede zeile ausliest und jede zeile als item/text fuer die combobox verwendet und in diese einfuegt.

    beim beenden soll das programm alle items aus der combobox in diese datei schreiben. dabei soll alles vorhandene in der textdatei ueberschrieben werden( da man im programm neue items hinzufuegen kann).

    folgenden code habe ich bereits:

    beim start:

    void program::programActivate(wxActivateEvent& event)
    {
            ifstream f;  // Datei-Handle
            string s;
    
    // hier sollte der code hin der ueberprueft ob die datei schon vorhanden ist oder neu erstellt werden muss
            f.open("C:\test.txt", ios::in);
    
            while (!f.eof())
            {
                getline(f, s);        // Lese eine Zeile
                Combobox->Append(s);
            }
            f.close();                // Datei wieder schließen
    }
    

    beim beenden habe ich bereits folgendes:

    void program::programClose(wxCloseEvent& event)
    {
            fstream f;  // Datei-Handle
            string s;
            f.open("C:\test.txt", ios::out | ios::trunc); // ios::trunc soll den inhalt loeschen
            int items = 0;
            items = Combobox->GetCount();  // getcount soll die anzahl an items zurueckgeben, stimmt das?
            int i = 0;
    
            while (i != items)         
            {
                s = Combobox->GetString(i);
    //wenn i = items ist dann kein \n anhaengen
                if (i == items)
                {
                f << s;
                }
                else
                {
                f << s << "\n";
                }
                i++;
            }
            f.close();                // Datei wieder schließen
    
        Destroy();
    }
    

    ist das zu kompliziert?



  • Also das sieht doch recht gut aus, nur solltest du aus dem while(!f.eof()) lieber while(f) machen - damit fängst du ein "Datei nicht vorhanden" direkt mit ab. (wenn die Datei nicht geöffnet werden könnte setzt sie afair das Fehlerflag)



  • CStoll schrieb:

    Also das sieht doch recht gut aus, nur solltest du aus dem while(!f.eof()) lieber while(f) machen - damit fängst du ein "Datei nicht vorhanden" direkt mit ab. (wenn die Datei nicht geöffnet werden könnte setzt sie afair das Fehlerflag)

    aber das while(!f.eof()) sagt mir doch wann die datei zu ende ist

    ob die datei vorhanden ist muss ich schon beim oeffnen wissen/ueberpruefen -> und da dann halt erstellen oder nicht erstellen

    oder hab ich das falsch verstanden?



  • also jetzt funktioniert es anscheinend:

    void program::programActivate(wxActivateEvent& event)
    {
            fstream f;  // Datei-Handle
            string s;
            f.open("C:\test.txt", ios::in);
            while(f)
            {
                while (!f.eof())          // Solange noch Daten vorliegen
                {
                    getline(f, s);        // Lese eine Zeile
    
                    if (s != "")
                    {
                        Combobox->Append(s);
                    }
                }
                f.close();                // Datei wieder schließen
            }
    }
    
    void program::programClose(wxCloseEvent& event)
    {
    
            fstream f;  // Datei-Handle
            string s;
            f.open("C:\test.txt", ios::out | ios::trunc);
            int items = 0;
            items = Combobox->GetCount();
            int i = 0;
    
            while (i != items)
            {
                s = Combobox->GetString(i);
                if (i == items)
                {
                f << s;
                }
                else
                {
                f << s << "\n";
                }
                i++;
            }
            f.close();
    
        Destroy();
    }
    

    ich glaub es lag an dem was CStoll geschrieben hat ( while(f) ), das hab ich jetzt um das ganze was bei while(!f.eof()) passiert gemacht.
    danke fuer den tipp



  • OK, dann mal langsam: while(f) (alias while(f.good()) ) prüft nach, ob die Datei einsatzbereit ist - das schließt neben EOF auch Fehler beim Einlesen und "Datei nicht geöffnet" mit ein. Da brauchst du keine doppelt verschachtelte while()-Schleife, sondern da reicht das:

    f.open("C:\test.txt", ios::in);
    while (f)          // Solange noch Daten vorliegen
    {
      getline(f, s);        // Lese eine Zeile
      if (s != "")
        Combobox->Append(s);
    }
    

    (übrigens das f.close() kannst du dir auch sparen - das macht der Stream selber, wenn die Funktion beendet wird ;))

    Wenn die Datei existiert (und geöffnet werden konnte), läuft diese Schleife solange durch, bis sie am Ende angekommen ist. Andernfalls scheitert schon das open(), setzt ein Fehlerflag und die Schleife wird sofort beendet.



  • aha, das wusste ich noch nicht, werde das gleich mal ausprobieren.



  • du brauchst sogar nichtmal open kannst den code also noch weiter verkürzen. Außerdem kannst du einfach ifstream verwenden, dann brauchst du ios::in nicht. Auch ist die funktion empty() schöner als der vergleich mit "".

    void program::programActivate(wxActivateEvent& event)
    {
            ifstream f("C:\test.txt");
            string s;
            while(f)
            {
                getline(f, s);        // Lese eine Zeile
                if(!s.empty())
                    Combobox->Append(s);
            }
    }
    


  • ja stimmt hab das mal so wie dus grade gepostet hast ubernommen, es funktioniert, dankeschoen.


Log in to reply