get() liest keine Zeichen aus Datei



  • Hi(gh)!

    Ich will den Quelltext (ASCII) einer lokal gespeicherten Wikipedia-Seite Zeichen für Zeichen in einen String einlesen:

    #include<iostream>
    #include <fstream>
    #include <string>
    #include <dirent.h>
    using namespace std;
    
    int main(void)
    {
      DIR *dir;
      dirent *entry;
      char *name;
      const char *path="/home/Verschiedenes/Orte/Testverzeichnis";
      ifstream datei;
      string source;
      char c;
      
      dir = opendir(path);
      while (dir)
      {  
        entry = readdir(dir);
        if (!entry) break;
        name = entry->d_name;
    
        cout << name << endl; // Testausgabe des Dateinamens
        
        datei.open(name);
    
        if (datei)
        {
           while (datei.get(c))
           {
        	  cout << c << endl;
        	  source.push_back(c);
            }
            cout << source << endl;
         }
         else
         {
            cerr << "Die Datei kann nicht geöffnet werden!" << endl;
            return -1;
         }
      }
    
      return 0;
    }
    

    Aus einem mir unerfindlichen Grund kann die Datei nicht geöffnet werden - obwohl ihr Name angezeigt wird, sie sich mit KWrite problemlos öffnen lässt und ich die Rechte der Datei auf 777 gesetzt habe! Warum?

    Bis bald im Khyberspace!

    Yadgar



  • Was soll der Titel? Mit dem Fehler hat er offensichtlich nichts zu tun!

    
    datei.open(name);
    
    

    Da steht jetzt also der Name einer Datei in irgend einem Verzeichnis in name. Wie soll die denn jetzt geöffnet werden, ohne das Verzeichnis zu nennen oder das working directory vorher zu setzen?



  • @manni66 sagte in get() liest keine Zeichen aus Datei:

    Was soll der Titel? Mit dem Fehler hat er offensichtlich nichts zu tun!

    
    datei.open(name);
    
    

    Da steht jetzt also der Name einer Datei in irgend einem Verzeichnis in name. Wie soll die denn jetzt geöffnet werden, ohne das Verzeichnis zu nennen oder das working directory vorher zu setzen?

    Natürlich... aber selbst das hier:

      const char *path="/home/Verschiedenes/Orte/Testverzeichnis/";
    
    [...]
    
        string fullpath = string(path);
        
        fullpath.append(string(name));
        
        cout << "Vollständiger Pfad: " << fullpath << endl;
        
        datei.open(fullpath.c_str(), ios_base::in);
    
    

    funktioniert nicht, ich bekomme immer nur "Die Datei kann nicht geöffnet werden!"...

    Bin ich eventuell doch zu dumm zum Programmieren?



  • Der Pfad muss halt Zeichen für Zeichen stimmen. Du arbeitest als Benutzer Verschiedenes?



  • @manni66 sagte in get() liest keine Zeichen aus Datei:

    Der Pfad muss halt Zeichen für Zeichen stimmen. Du arbeitest als Benutzer Verschiedenes?

    Nein, das /home-Verzeichnis (als separate Partition) enthält sowohl das Benutzerverzeichnis (yadgar) als auch auf derselben Verzeichnisebene sämtliche Daten! Also müsste /home/Verschiedenes/Orte/Testverzeichnis/Aach_Hegau_Wikipedia.html der richtige Weg zur auszulesenden Datei sein!

    Und trotzdem gibt datei.open(fullpath.c_str(), ios_base::in) ein false zurück!



  • @Yadgar
    Könnte es sein, dass sich irgendwo ein Stringende-NULL reingeschmuggelt hat?



  • @Yadgar wie?

    1. kopiere den Dateinamen, den dein Programm ausgibt, öffne ein Terminal und führe less Dateiname aus

    2. füge unmittelbar nach open perror(”open”); ein. Möglicherweise musst du noch #include <stdio.h> einfügen.



  • @manni66 sagte in get() liest keine Zeichen aus Datei:

    1. kopiere den Dateinamen, den dein Programm ausgibt, öffne ein Terminal und führe less Dateiname aus

    Dann wird der Inhalt der Datei genau so angezeigt, wie KWrite ihn darstellen würde!

    1. füge unmittelbar nach open perror(”open”); ein. Möglicherweise musst du noch #include <stdio.h> einfügen.

    Dann bekomme ich das hier:

    .
    Vollständiger Pfad: /home/Verschiedenes/Orte/Testverzeichnis/.
    open: Success

    Aach_Hegau_Wikipedia.html
    Vollständiger Pfad: /home/Verschiedenes/Orte/Testverzeichnis/Aach_Hegau_Wikipedia.html
    open: Is a directory
    Die Datei kann nicht geöffnet werden!

    Was soll das?!?



  • @Yadgar

    Es sieht so aus, als konnte ich mein Problem lösen: um nicht mit den Standard-Verzeichniseinträgen "." und ".." ins Gehege zu kommen, teste ich vor dem Öffnen auf "html" als Bestandteil des Gesamtpfades!

    Dann wird tatsächlich nur die Wikipedia-Quelltextdatei geöffnet und testhalber angezeigt!

    Der relevante Code sieht jetzt so aus:

      dir = opendir(path);
      while (dir)
      {  
        entry = readdir(dir);
        if (!entry) break;
        name = entry->d_name;
    
        cout << name << endl; // Testausgabe des Dateinamens
        string fullpath = string(path);
        fullpath.append(string(name));
        // cout << "Vollständiger Pfad: " << fullpath << endl;
        if (fullpath.find("html") != -1)
        {
          datei.open(fullpath.c_str(), ios_base::in);
          // perror("open");
        
          if (datei)
          {
    	while (datei.get(c))
    	{
    	  // cout << c << endl; // Kontrollausgabe Zeichen für Zeichen
    	  source.push_back(c); 
    	}
    	cout << source << endl;
          }
          else
          {
    	cerr << "Die Datei kann nicht geöffnet werden!" << endl;
    	return -1;
          }
        }
      }
    
    Bis bald im Khyberspace!
    
    Yadgar
    


  • Deine Lösung passt allerdings nicht zu dem vorherigen Problem die Datei lässt sich nicht öffnen.



  • @manni66 sagte in get() liest keine Zeichen aus Datei:

    Deine Lösung passt allerdings nicht zu dem vorherigen Problem die Datei lässt sich nicht öffnen.

    O.k., die Lösung ist damit ungültig, und ich muss mein Programm unverzüglich löschen, damit die Form gewahrt bleibt! Tja, in der richtigen (Programmierer-)Welt geht halt ein Problem in das andere über, das lässt sich nicht immer so clean voneinander wegschubladisieren...



  • @Yadgar sagte in get() liest keine Zeichen aus Datei:

    @manni66 sagte in get() liest keine Zeichen aus Datei:

    Deine Lösung passt allerdings nicht zu dem vorherigen Problem die Datei lässt sich nicht öffnen.

    O.k., die Lösung ist damit ungültig, und ich muss mein Programm unverzüglich löschen, damit die Form gewahrt bleibt! Tja, in der richtigen (Programmierer-)Welt geht halt ein Problem in das andere über, das lässt sich nicht immer so clean voneinander wegschubladisieren...

    Du redest dummes Zeug.



  • @Yadgar sagte in get() liest keine Zeichen aus Datei:

    /home/Verschiedenes/Orte/Testverzeichnis/Aach_Hegau_Wikipedia.html

    Wenn die Datei wirklich dort ist dann reicht

    std::ifstream is{ "/home/Verschiedenes/Orte/Testverzeichnis/Aach_Hegau_Wikipedia.html" };
    


  • @Yadgar
    Kann es sein das "datei" vor Gebrauch durch datei.open(blabla) initialisiert werden muss?
    Sieh dir folgendes Beispiel an

        ifstream In = ifstream("input.txt");
    
        if(!In.is_open())
        {
            printf_s("not open :(\n");
            return -1;
        }
    


  • @Yadgar
    Ah eben☺ dein Fehler liegt in "if(datei)" der muss "if(datei.is_open())" lauten


  • Mod

    @EL-europ sagte in get() liest keine Zeichen aus Datei:

    @Yadgar
    Ah eben☺ dein Fehler liegt in "if(datei)" der muss "if(datei.is_open())" lauten

    Nein.





  • @Swordfish
    Ich hab nur oberflächlich Ahnung von cpp. Muss "datei erst zu bool gecastet werden bevor ich einfach if(datei) prüfe?

    zu ifstream.is_open() hab ich folgndes gefunden
    https://www.cplusplus.com/reference/fstream/ifstream/is_open/
    Dort steht das mit is_open() gerprüft wird ob ein Stream mit dem ifstream-Objekt assoziiert ist, das bedeutet doch "geöffnet"?


  • Mod

    @EL-europ sagte in get() liest keine Zeichen aus Datei:

    Ich hab nur oberflächlich Ahnung von cpp.

    Und deswegen sind Aussagen wie

    @EL-europ sagte in get() liest keine Zeichen aus Datei:

    dein Fehler liegt in "if(datei)" der muss "if(datei.is_open())" lauten

    problematisch. Deine Antwort ist nämlich falsch und irreführend.

    Muss "datei erst zu bool gecastet werden bevor ich einfach if(datei) prüfe?

    zu ifstream.is_open() hab ich folgndes gefunden
    https://www.cplusplus.com/reference/fstream/ifstream/is_open/
    Dort steht das mit is_open() gerprüft wird ob ein Stream mit dem ifstream-Objekt assoziiert ist, das bedeutet doch "geöffnet"?

    Nein, nein, nein. Die Prüfungen waren schon richtig so, vor deinen "Korrekturen". Wie es richtig aussieht, siehst du ja, und es wurden auch Anleitungen verlinkt. Was soll man da noch groß erklären, außer dass deine Interpretationen der Anleitungen falsch sind? Eine Kompletterklärung zu den Grammatikregeln von C++ im allgemeinen, und der Anwendung derselben auf die Streamschnittstellen im speziellen würde zu weit führen. Du brauchst halt mehr Erfahrung, dann beantwortet sich das alles von alleine.



  • @EL-europ Die Condition eines if-Statements wird immer implizit zu bool konvertiert.


Log in to reply