Problem mit Deiteinamenlänge



  • Hallo!

    Folgendes Problem, wo ich eure Hilfe benötige:

    Ich lese in einen std::string ein Dateinamen ein. Die Dateinamen sind 40 Zeichen lang! Habe da leider auch keinen Einfluss drauf.

    In meinem Programm übergebe ich den Dateinamen in die Variable um den Stream zu öffnen:

    ifstream file_stream(variable.c_str(), ios::in);
    
        if (!file_stream)
            return false;
    

    Mein Programm steigt dann an dieser Stelle beim Öffnen aus. Wenn ich den Dateinamen händisch eingebe (also mit " ") funktionierts! Wenn ich den Dateinamen in Windows verkürze gehts auch!

    Ich will aber nicht 50 oder mehr Dateien ständig umbennen.

    Hat jemand eine Lösung zu meinem Problem? Was kann ich tun? Gibt es eine Möglichkeit, dass meine langen Dateien geöffnet werden? Kann mir jemand sagen wie viele Zeichen da max. möglich sind?

    Vielen Dank für eure Hilfe



  • Hallo,

    Mit welcher Windowsversion arbeitest du denn? In W2k und WXP können die Dateinamen 255 Zeichen lang sein (inklusive Pfad). Das Problem ist wohl ein anderes.
    Sind da vielleicht Leerzeichen oder sowas drin, die beim einlesen verloren gehen?
    Hast du mal kontrolliert, ob der name in deinem String korrekt ist?



  • Wie es steigt aus? Stürzt es richtig ab?
    Und wenn Du den Namen mit 50 Zeichen direkt als Literal angibst, funktioniert es?

    Welchen Compiler bzw. Stdlib-Implementierung benutzt du?



  • Lass dir einfach mal "variable.c_str()" ausgeben (wie Braunstein schon sagte).



  • Braunstein schrieb:

    In W2k und WXP können die Dateinamen 255 Zeichen lang sein (inklusive Pfad). Das Problem ist wohl ein anderes.

    das passiert manchmal schneller als man denkt.

    C:\Dokumente und Einstellungen\meintollerbenutzername\Anwendungsdaten\blödeC++IDE\Profil2348\workspace\Projects\testprogramm\src\Daten\dateizumlesenmitlangemnamen.txt

    sind noch lange keine 255 zeichen, aber die idee kam rüber? ^^



  • Habe mir auch schon zuvor meine Variable ausgeben lassen. Der Dateiname wird korrekt angezeigt. Es sieht nicht so aus als ob der String sonstige Zeichen enthält. Ich lese die Dateinamen aus einer anderen Datei, wo alle aufgelistetet sind, aus.

    Meine Dateien gebe ich ohne Pfad an, da ich das Programm direkt im gleichen Ordner laufen lasse.
    Abstürzen tut es nicht. Es öffnet mir einfach meine Datei nicht. Wenn ich es als Literal eingabe, also:

    ifstream file_stream("Dateiname.txt", ios::in);
    
        if (!file_stream)
            return false;
    

    geht es und die Datei wird zum Bearbeiten geöffnet. Ich benütze Dev C++ in der Version 4.9.9.2



  • Wenn der String den gleichen Dateinamen enthält, muss es gehen. Es muss also einen Unterschied geben. Zeig doch mal etwas mehr Code.



  • mach mal testweise bitte:

    assert (variable == "Dateiname.txt");
    

    direkt vor den Code, den du gepostet hast. (<cassert> einbinden).

    edit: scheiß copy&paste. Danke Braunstein



  • Mach das besser ohne c_str() sonst werden hier nur Pointer verglichen (oder war das die Absicht?).



  • Also mit assert wird das Programm abgebrochen!
    Muss also doch einen Unterschied geben. Nur komisch, dass es bei einem kürzeren Dateinamen genau so wie ichs jetzt habe klappt?!

    Hier mal mein Code:

    bool search(const string& file_name)
    {
    
        string file_intern("Abc-Abc");
        file_intern += file_name;
        file_intern += ".dat";
    
        assert (file_intern.c_str() == "Abc-Abc01234567890abcdefghijklmnopqrstuvwxyz.dat"); 
        ifstream file_stream(file_intern.c_str(), ios::in);
    
        if (!file_stream)
            return false;
    
        cout << "blablabla";
        return true;
    }
    
    int main()
    {
        ifstream file_stream("Auslesen.txt", ios::in);
        if (!file_stream)
            return -1;
    
        string input;
        while (file_stream.eof() == false)
        {
            for (unsigned short x = 0; (x < 3 && file_stream.eof() == false); ++x)
            {
                file_stream >> input;
                if (x == 0)
                   search(input);
            }
        }
        system("PAUSE");
    }
    

    Auslesen.txt sieht folgendermaßen aus:

    01234567890abcdefghijklmnopqrstuvwxyz 12:00 11.06.2007
    abcdefghijklmnopqrstuvwxyz01234567890 13:00 12.06.2007
    


  • Die Assertion ohne .c_str( )!

    greetz, Swordfish



  • Sorry hat ich übersehen!
    Gehen tuts so oder so nicht 😞



  • sagte ich doch. 🙂



  • und woran liegts?! 🙄



  • OK, habe deinen Code kopiert (paar includes zugebaut), mir die Datei Auslesen.txt erstellt mit dem Inhalt

    01234567890abcdefghijklmnopqrstuvwxyz 12:00 11.06.2007
    abcdefghijklmnopqrstuvwxyz01234567890 13:00 12.06.2007
    

    und die Datei Abc-Abc01234567890abcdefghijklmnopqrstuvwxyz.dat einfach leer.

    Wunderbar, "search" wird aufgerufen, ich komme durch die Assertion, er öffnet die Datei, der Stream ist OK (ich fliege also nicht vorzeitig raus).
    Dann kommt der zweite Aufruf von "search" mit "abcdefghijklmnopqrstuvwxyz01234567890". Da fliege ich natürlich dann bei der Assertion raus, weil der Name ja diesmal ein anderer ist.

    Also alles, wie erwartet. Bei mir läuft dein Code.



  • bool search(const std::string& file_name)
    {
        std::string file_intern("Abc-Abc");
        file_intern += file_name;
        file_intern += ".dat";
    
        std::ifstream file_stream(file_intern.c_str(), std::ios::in);
        return (!file_stream ? false : true);
    }
    
    int main()
    {
        std::ifstream file_stream("Auslesen.txt", std::ios::in);
        if (!file_stream)
            return -1;
    
        std::string input;
        while (std::getline(file_stream, input))
            if (search(input.substr(input.find_first_of(' '))) == false)
                std::cerr << "Zeile: " << input << std::endl;
    }
    

    🙂



  • return (!file_stream ? false : true);
    

    rofl mao



  • hallo xr800,

    wie wird der Dateistring denn erzeugt/geschrieben? vielleicht schwirrt ja am Ende noch so ein hässliches line feed / cariage return rum? Gib deshalb mal in deinem Programm den zuvor eingelesenen Dateinamen HEXADEZIMAL aus. Siehst du da irgendwo sowas wie 0A oder 0D?

    von Ney


Anmelden zum Antworten