ifstream öffnet Datei nicht, obwohl sie existiert



  • Hallo,

    ich habe folgendes Problem: Ich habe ~2000 auf die gleiche Weise automatisch generierte Dateien. Diese moechte ich per ifstream nacheinander einlesen mit folgendem Code:

    for (const auto& file : filenames) // "filenames" ist vector<string> mit den 2000 Dateinamen
    {
        std::ifstream lesen(file);
        if(!lesen)
            std::cout<<"Fehler..".
    }
    

    Die ersten 1119 Dateien werden normal eingelesen, aber bei der 1120. Datei bekomme ich die Ausgabe "Fehler..." . Um der Sache auf den Grund zu gehen habe ich Folgendes gemacht:

    for (const auto& file : filenames) // "filenames" ist vector<string> mit den 2000 Dateinamen
    {
        std::ifstream lesen(file);
        if(!lesen)
        {
            std::cout<<"Fehler..".
    
            // probiere fopen statt ifstream - schlägt auch fehl!
            FILE* f = fopen(file.c_str(), "r");
            if(f == nullptr)
                std::cout<<"geht auch nicht";
    
            // Folgendes funktioniert. Datei existiert also und ist lesbar!
            system(("cat "+file).c_str()); // probiere, die Datei ins terminal zu schreiben
            system(("vim "+file).c_str()); // probiere, die Datei mit vim zu oeffnen
        }
    }
    

    Auch mit fopen gibt es bei dieser einen Datei einen Fehler. Wenn ich aber versuche, die Datei per cat ins terminal zu schreiben oder sie mit vim zu öffnen (ich bin auf einer linux Maschine), dann wird sie mir ganz normal angezeigt. Die Datei existiert also und ist lesbar und auf genau die selbe Art und weise erstellt, wie die 1000 zuvor eingelesenen Dateien. Kann cat/vim irgendwas, das ifstream/fopen nicht kann? Kompiliert habe ich mit g++ und Clang und beide scheitern bei der gleichen Datei.

    Hat jemand eine Idee, was man noch probieren kann, um herauszufinden, was hier schief läuft?



  • Naive Vermutung: std::ifstream gibt seine Ressourcen/das Dateihandle nicht frei, die Datei bleibt offen, und irgendwann erreichst du das Prozesslimit und kannst keine Datei mehr öffnen.

    Nur: std::ifstream sollte RAII unterstützen, sprich: ein spezieller close -Call sollte nicht notwendig sein. Aber probier's mal trotzdem. Wenn's danach funktioniert, dann stimmt was mit dem Destruktor von std::ifstream nicht, würde ich sagen.



  • Daran habe ich auch schon gedacht. Ich habe per hand lesen.close() aufgerufen, aber ohne Änderung.



  • Werden Fehlerbits beim Schließen gesetzt? Hängt es immer an der gleichen Datei? Um was für eine Datei handelt es sich hier (spezielle Datei/Verzeichnis/Gerätedatei)?



  • Wie ist denn der Dateiname der Datei, die nicht geöffnet werden konnte? Wie lautet der Fehler?

    -> also z.B.

    if (lesen.fail()) cerr << "Error code: " << strerror(errno) << " beim Öffnen von <" << file << ">\n" ;
    

    Den Dateinamen bitte unbedingt mit ausgeben, denn mit system, also bei cat/vim werden ggf. Zeichen unescapet oder gar Kommandozeilenargumente aus dem Dateinamen geparst oder ein ggf. vorhandendes Zeilende-Zeichen wird weggenommen oder oder...

    Und dann noch eine andere Idee basierend auf Dachschadens Idee und schmerzlicher Erfahrung meinerseits in einer anderen Auch-Insel-Sprache: gibst du in der for-Schleife den Dateinamen an irgendeine andere, ggf. externe Biliothek weiter, die vielleicht die Datei ebenfalls öffnet, aber nicht korrekt schließt?



  • Wie erwartet lag es nicht an ifstream, sondern an mir. Der Fehler war tatsächlich zu viele offene Dateien. Die Dateinamen habe ich nämlich über "opendir" (unix) bestimmt, aber nicht "closedir" zum schließen benutzt...

    Danke für eure Hilfe!


Anmelden zum Antworten