Funktion gesucht



  • Das mit txt war doch nur ein Beispiel - eigentlich geht's ja um XML-Dateien, aus denen ich SQL-Befehle generieren will 😉

    Mal noch eine andere Frage im Zusammenhang mit substr - wie bekomme ich die Länge des Strings zurück?

    Es funktioniert weder

    tmp = tmp.substr(tmp.size, 4);
    

    noch

    tmp = tmp.substr(size(tmp), 4);
    

    noch das selbe mit length.



  • Hallo

    tmp = tmp.substr(tmp.size() -4, 4);
    

    bis bald
    akari



  • Jetzt scheitert es nur noch daran, dass ich den Inhalt der Speicherzelle, auf die der Pointer entry->d_name zeigt, nicht in den String geschoben bekomme.

    Wenn ich

    string tmp = entry->d_name;
    

    zuweise, dann wird ja nur die Speicheradresse kopiert, wie komme ich jetzt an den Inhalt?
    Irgendwie sind Pointer ein Buch mit 7 Siegeln für mich 😞



  • Hallo

    string tmp = *(entry->d_name);
    

    bis bald
    akari



  • Hatte es mit & versucht, aber das braucht man wohl bei Referenzen oder so 🙄

    Allerdings läuft es jetzt immer noch nicht. Der Debugger von Dev-C++ ist allerdings auch recht bescheiden.
    Ich häng mal den kommentierten Code ran.

    #include <fstream>
    #include <iostream>
    #include <dirent.h>
    #include <string>
    
    using namespace std;
    
    int main(void)
    {
        DIR *hdir;
        struct dirent *entry;
    
        hdir = opendir(".");
        do
        {
            entry = readdir(hdir);
            if (entry)
            {
                string tmp;
                tmp = *(entry->d_name);
                if (tmp.size() > 4) //string sollte mind. 5 zeichen haben, sonst gibt's probleme beim kürzen
                {
                    tmp = tmp.substr(tmp.size() - 5, 4);
                    if(tmp == ".xml")
                    {
                        ifstream in(entry->d_name);  //Eingabedatei öffnen
                        if(!in)
                        {
                            cout << "Fehler beim Öffnen von Datei xyz"; //muß noch variabel gestaltet werden
                            return 1;
                        }   
                        char buf[255]; //Puffer
                        while(in.getline(buf, 255)) //solange nicht Dateiende erreicht, zeilenweise einlesen
                        {
                            cout << buf;
                        }    
                        in.close(); //Eingabedatei schließen
                    }    
                }     
            }
        } while (entry);
        closedir(hdir);
    
        getchar();
        return 0;
    }
    

    Also anscheinend wird der Name der potentiellen Datei, die auch ein Ordner sein kann, nicht korrekt in tmp geschrieben, da die Schleife bei tmp.size > 4 nie betreten wird - sieht da jemand einen Fehler?



  • mach doch einfach mal "cout" - debugging. bau an viele stellen ein cout ein, der dir die informationen über bestimmte variablen ausgibt(oder einfach nur eine meldung das du weist, das programm ist jetzt in if schleife), so findest du schneller heraus worans liegt, als wenn du immer auf replys im forum wartest.



  • Anscheinend wird nur das erste Zeichen von entry->d_name in tmp geschoben, daher arbeitet er auch den if-Zweig nicht ab.



  • Tja, wenn entry->d_name ein const char* ist dann ist die Dereferenzierung dieses const char* ein char... und das ist ein einzelnes Zeichen 😉

    Allerdings wüsste ich nicht was an

    string tmp( entry->d_name );
    

    oder

    string tmp = entry->d_name;
    

    auszusetzen sein sollte.

    EDIT:
    dirent.d_name ist sogar nichtmal const...



  • Jetzt scheint es endlich zu klappen, danke allen 👍

    Die nächsten Probleme werden nicht auf sich warten lassen... 😃



  • Diesmal brauche ich eine Splitfunktion, d.h. eine, die einen String in Teilstrings anhand eines Separators zerteilt. Gibt's da was?

    Ansonsten hätte ich eine Frage zur Rückgabe von Funktionen. Kann man direkt ein Array zurückgeben oder muss man das mit dem Zeiger auf das Nullte Element des Arrays machen?



  • UNeverNo schrieb:

    Diesmal brauche ich eine Splitfunktion, d.h. eine, die einen String in Teilstrings anhand eines Separators zerteilt. Gibt's da was?

    Vorgefertigtes gibt es da nichts, aber du kannst dir mit den String-Methoden find_first_of(), find_first_not_of() (suche Seperator-Grenzen) und substr() (schneide Teilstring aus) selber was zusammenbauen.

    Ansonsten hätte ich eine Frage zur Rückgabe von Funktionen. Kann man direkt ein Array zurückgeben oder muss man das mit dem Zeiger auf das Nullte Element des Arrays machen?

    Arrays übergeben geht direkt nicht. Und bei Pointern mußt du aufpassen, daß das Ziel auch nach Funktionsende gültig bleibt (also entweder static Variablen (aber dann mußt du das Ergebnis vor dem nächsten Aufruf verarbeitet haben), Heap-Blöcke (die muß der Nutzer wieder freigeben) oder vom Hauptprogramm übergebene Parameter).
    Als Alternativen bietet sich noch an, den Nutzer mit der Speicherreservierung zu beauftragen (du nimmst ein Array als Parameter entgegen und schreibst deine Rückgaben dort rein) oder STL-Container weiterzureichen.


Anmelden zum Antworten