Datei öffnen klappt nicht



  • ich gebe per cout (wie gerade beschrieben) fName aus, genau an dieser Stelle, wie ich oben die anderen Ausgaben mache, und ich bekomme "test.txt" ausgegeben.

    Ich denke den Code dazu kann sich jeder selbst denken. Wozu also mehr Code, wenn doch der Inhalt dieser Variable sicher feststeht?

    Gibt es vielleicht irgendwelche Fehlervariablen, die ich ausgeben lassen kann, um weiterzukommen?



  • deetee schrieb:

    ich gebe per cout (wie gerade beschrieben) fName aus, genau an dieser Stelle, wie ich oben die anderen Ausgaben mache, und ich bekomme "test.txt" ausgegeben.

    Ich denke den Code dazu kann sich jeder selbst denken. Wozu also mehr Code, wenn doch der Inhalt dieser Variable sicher feststeht?

    kann mir denken, dass da der Fehler drin sien muss...



  • Wenn du nicht willst, dass man dir hilft, warum postest du dann hier überhaupt?



  • Meine Güte, hier der Code, wenn ihr meinen Worten nicht glauben wollt. Es ist so wie ich es schon 2mal beschrieben habe:

    void Test :: readFile(string fName)
    {
        ifstream tmp;
    
    cout << fName << endl; // Ausgabe: test.txt
    
    cout << tmp.fail() << endl; // Ausgabe: 0
    
        tmp.open(fName.c_str(), ios::in);
    
    cout << tmp.fail() << endl; // Ausgabe: 1
    
    ...
    }
    

    So, und das hat nix damit zu tun, dass ich nicht möchte, dass mir geholfen wird, ich möchte ja, dass man mir hilft. Aber wenn man hier meinen Aussagen keinen Glauben schenkt und das bei so einer simplen Sache wie einer Ausgabe, dann nervt das nur.

    Es gibt sicher ein paar Möglichkeiten wo das Problem liegen könnte, aber an der Inhalt ist auf den ersten Blick jedenfalls richtig. Meint ihr, dass hätte ich nicht als erstes geprüft oder was? Hier wird einem erstmal jegliche Kompetenz abgesprochen, wenn man jemandem helfen soll, was?

    Und bitte beachtet meine bisherigen Fragen, falls sie einer beantworten kann, wäre das hilfreich. Euer Gejammer ist es jedenfalls nicht wirklich. Und ob euch der Code da oben weiterhilft, sei mal dahingestellt.



  • deetee schrieb:

    So, und das hat nix damit zu tun, dass ich nicht möchte, dass mir geholfen wird, ich möchte ja, dass man mir hilft. Aber wenn man hier meinen Aussagen keinen Glauben schenkt und das bei so einer simplen Sache wie einer Ausgabe, dann nervt das nur.

    Es geht nicht darum, dass deinen Aussagen nicht geglaubt wird. Das Problem ist, dass erstens deine Aussagen das Problem nicht erklären konnten (wie auch, nach den Aussagen ist ja alles korrekt) und vor allem du etwas in deinem eigenen Code übersehen haben könntest was du uns dann in deinen Aussagen natürlich nicht darlegen kannst. Vier Augen (oder hier wohl noch ein paar dutzend mehr) sehen nunmal mehr als zwei.

    deetee schrieb:

    Es gibt sicher ein paar Möglichkeiten wo das Problem liegen könnte, aber an der Inhalt ist auf den ersten Blick jedenfalls richtig.

    Auf den ersten Blick vielleicht. Irgendwer hat aber schonmal nicht darstellbare Zeichen angesprochen. Die dürftest du am besten mit einem Debugger aufspüren können, jedoch nicht mit einer einfachen Ausgabe.



  • Schreib an den Anfang deiner Funktion mal ein assert( fname == "test.txt" );
    Wenn das einen Fehler liefert, dann weißt du, dass in fname etwas anderes als "test.txt" drin steht.
    Und wenn dem so ist, solltest du den gesamten Code posten indem fname verwendet wird und sämtlichen code über den "test.txt" in diese Funktion transportiert wird.

    Oder du gehst mit dem Debugger stück für stück durch und beobachtest den Inhalt von fname



  • na also, schon kommt der hinweis der mich weitergebracht hat. mit assert() hab ich jetzt rausgefunden, dass noch ein \n an test.txt dranhängt. dieses gilt es nun zu entfernen, wie, das weiß ich noch nicht. Kennt jemand eine gute Möglichkeit? Eine Funktion die Sonderzeichen bzw. Steuerzeichen aus einem String entfernt, wäre hilfreich, falls es sowas gibt?



  • Du kannst das trim aus boost verwenden oder dies:

    struct IsSpace : std::unary_function<char, bool> {
        bool operator()(char c) const {
            return isspace(static_cast<unsigned char>(c)) != 0;
        }
    };
    
    void trim(std::string &s) {
        s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(IsSpace())));
        s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(IsSpace())).base(), s.end());
    }
    

    Wie stellst du denn den string zusammen? Falls du ihn aus einem anderen kopierst, reicht es vielleicht einfach ein Zeichen weniger zu kopieren. Ansonsten wenn es wirklich immer nur das eine Zeichen ist kannst du auch dies machen:

    s.erase(s.length()-1);
    

    erase löscht alle Zeichen ab dem angegebenen index. In diesem Fall also das letzte.

    Greetz



  • deetee schrieb:

    na also, schon kommt der hinweis der mich weitergebracht hat.

    Hättest du einfach mal den Code gepostet, der für die Initialisierung der Stringvariable zuständig ist (hast du ja nach wie vor nicht), wäre eine hilfreiche Antwort viel früher möglich gewesen.

    mit assert() hab ich jetzt rausgefunden, dass noch ein \n an test.txt dranhängt. dieses gilt es nun zu entfernen, wie, das weiß ich noch nicht.

    Wenn du wirklich nur ein abschließendes '\n' entfernen willst, hilft folgender Aufruf:

    string s = ...;
    s.erase(s.size()-1);
    

    Besser wäre noch:

    string s = ...;
    s.erase(s.find_last_not_of(" \t\n\r")+1);
    

    In beiden Fällen darf der String nicht leer sein!



  • danke für eure tipps. ich hab mir jetzt was mit erase() zusammengebastelt. ging am einfachsten für meinen zweck. Sauber ist das irgendwie ja nicht, aber das ist mir erstmal egal.


Anmelden zum Antworten