C++: Zeichen aus Datei einlesen



  • Werner Salomon schrieb:

    1.) Im Konstruktor von ReadFile wirfst Du eine Exception, die nirgendwo gefangen wird. Das sollte zwar keinen 'Segmentation fault' auslösen, aber ein ungewolltes Programmende. Das die Exception geworfen wird, ist sehr wahrscheinlich, weil 'parms[0]' in Zeile 15 nicht der Dateiname, sondern der letzte Parameter ist.

    Ich würde jetzt sagen, dort wird eine Exception gefangen, die niemals geworfen wird. Deshalb wird auch nicht festgestellt, dass die Datei nicht geöffnet werden kann.



  • @manni66: 😃 Stimmt!



  • Vielen Danke. Aber ich sitz jetzt auf der Leitung. Wie kann ich den Fehler beheben sprich was muss ich am Code ändern?



  • z.B.

    class ReadFile {
    
    private:
      std::string filename;
      std::fstream file;
    
    public:
      ReadFile(std::string f)  {
        filename = f;
        file.open(filename.c_str(), std::fstream::in | std::ios::binary);
      }
    
      bool eof(){ return file.eof();  }
      bool good() { return file.good(); }
    
      char GetChar() {
        return file.get();
      }
    };
    

    und

    ReadFile F(filename);
    if(!F.good() ) {
       std::cerr << "Fehler\n";
       exit(1);
    }
    


  • und wo ist der witz darin einen ifstream so zu kapseln, wenn man ihn genausogut "pur" verwenden könnte?



  • mit dem neuen Code bekomme ich einen Fehler dass filename nicht deklariert ist.. der ist aber deklariert





  • Swordfish schrieb:

    und wo ist der witz darin einen ifstream so zu kapseln, wenn man ihn genausogut "pur" verwenden könnte?

    Nirgendwo. Der Prof/Hiwi ist zu blöd, etwas ordentliches zu schreiben.



  • jokki58 schrieb:

    Vielen Danke. Aber ich sitz jetzt auf der Leitung. Wie kann ich den Fehler beheben sprich was muss ich am Code ändern?

    dann hast Du u.U.das #include <string> vergessen oder gelöscht.

    Ich habe mir mal erlaubt, das Ganze zu überarbeiten:

    #include <iostream>
    #include <vector>    
    #include <fstream>
    
    // .. keine globalen Variablen
    
    int main(int argc, char *argv[]){
        using namespace std;
        if( argc < 2 )
            { cout << "Usage: gip-wc -w -l -c filename" << endl; return 0;} // wozu die Optionen ??
    
        const char* filename = argv[argc-1];    // reicht auch, statt std::string
        ifstream F( filename );
        if( !F.is_open() )
        {
            cout << "Fehler beim Oeffnen der Datei '" << filename << "'" << endl;
            return 0;
        }
    
        int lcount = 0, wcount = 0, ccount = 0, abcount = 0;    // lokal deklarieren
        enum Letztes_zeichen_typ { ANFANG, SPACE, NEUE_ZEILE, ABSATZ, SONSTIGES } letztes_zeichen = ANFANG;
        F >> noskipws; // Leerzeichen mit lesen
        for( char zeichen; F >> zeichen; ++ccount )
        {
            if( zeichen == '\n' )
            {
                ++lcount;   // Zeilen zählen
                if( letztes_zeichen == SONSTIGES )
                    ++wcount;   // Wort endete mit '\n'
                if( letztes_zeichen == NEUE_ZEILE )
                {
                    ++abcount;
                    letztes_zeichen = ABSATZ;   // so wird dreimal neue Zeile nicht als zwei Absätze gezählt.
                }
                else if( letztes_zeichen == SONSTIGES || letztes_zeichen == SPACE )
                    letztes_zeichen = NEUE_ZEILE;
            }
            else if( isspace( zeichen ) )
            {
                if( letztes_zeichen == SONSTIGES )
                    ++wcount;
                letztes_zeichen = SPACE;
            }
            else
            {   // sonstiges
                letztes_zeichen = SONSTIGES;
            }
        }
        // --   Nachbehandlung
        if( letztes_zeichen == SONSTIGES || letztes_zeichen == SPACE )
        {
            ++lcount;
            ++abcount;
        }
        else if( letztes_zeichen == NEUE_ZEILE )
        {
            ++abcount;
        }
    
        //Ausgabe
        cout << endl;
        cout << "Die Datei \"" << filename << "\" hat: " << endl;
        cout << "\t" << lcount << " Zeilen"<< endl;
        cout << "\t" << wcount << " Woerter" << endl;
        cout << "\t" << ccount << " Zeichen"<< endl;
        cout << "\t" << abcount << " Absaetze" << endl;
    
        return 0;
    }
    

    Gruß
    Werner



  • Danke Werner. Jetzt klappt es teilweise 😕 Ich kompilier das Programm aber dann muss ich ja " gip-wc -w -l -c filename" eingeben aber dann sagt der mir " gip-wc : command not found" woran liegt das?



  • Dein Programm liegt nicht in den Verzeichnissen der PATH Environmentvariablen.

    Auf Linux kannst du mal ./gip-wc probieren, wenn das Programm im aktuellen Verzeichnis ist.

    Welches System/Compiler/IDE nutzt du?



  • Das Programm funktioniert jetzt. Vielen Dank an alle 🙂


Anmelden zum Antworten