zweimal while(!datei.eof())



  • Wenn Du eof erreicht hast steht der Dateizeiger am ende.

    mit seekg(0,ios::beg); setzt Du diesen wieder an den Angang.

    Ein datei.clear(); sollte auch das eof bit löschen.



  • danke 😃 ab jetzt sollt eich wirklich öfters hier reinschauen...



  • Trotzdem habe ich immernoch nicht den gewünschten effekt...

    hier mal den code ausschnitt

    for(i=0;i<257;i++)
        {
        key = i;
        cout << "Key: " << i << "|" << key << endl;
        cout << i << ". Variante" << endl;
    
        while(!in.eof()) //In die Datei einlesen
            {
                cout << "cracke..." << endl;
                cout << "schreibe..." << endl;
                out<<crypt(ch,key);
                cout << "schreibe char..." << endl;
                ch=in.get(); /*In ein char einlesen um die Datei zum eof zu bringen */
                cout << ch << endl;
            }; //While
    
            //Anzeigen:
            in.clear();
            isub = 256 - i;
            cout << "Noch " << isub << " Varianten..." << endl;
        }; //for
    

    Leider überspringt er die while oder führt sie nur einmal aus...



  • Wie machst Du in auf - und wie groß ist die Datei ?



  • aufmachen:

    ifstream in("text.txt");

    Datei ist nicht soo groß, ein Satz unformatierter Text.



  • for(i=0;i<257;i++)
        {
        key = i;
        cout << "Key: " << i << "|" << key << endl;
        cout << i << ". Variante" << endl;
    
        while(!in.eof()) //In die Datei einlesen
            {
                cout << "cracke..." << endl;
                cout << "schreibe..." << endl;
                out<<crypt(ch,key);
                cout << "schreibe char..." << endl;
                ch=in.get(); /*In ein char einlesen um die Datei zum eof zu bringen */
                cout << ch << endl;
            }; //While
    
            //Anzeigen:
            in.seekg(0,ios::beg); // <<--------------- try this pls
            in.clear();
    
            isub = 256 - i;
            cout << "Noch " << isub << " Varianten..." << endl;
        }; //for
    


  • hm... kann es sein das da sLinux ausgelastet ist? habe das gleiche mal mit zwei for schleifen ausprobiert, er durchläuft die forschleife (fori=0;fori < 257; fori++) nur einmal und zwar: 17.

    for...
    {
    ...
    for
    {
    ...
    };
    };



  • Sprich doch nich rätseln.... 🤡

    for(int i = 0;i< 10;++i)
    {

    }

    for(;i<10;++i)
    {
    }

    geht natürlich nicht.

    ka was Du machst 🤡 Zeig mal mehr source

    [ Dieser Beitrag wurde am 10.06.2003 um 16:25 Uhr von Knuddlbaer editiert. ]



  • Also ich hab das Problem gelöst mit einem while und indem while eine for, so klapts...

    hehe source wird nicht gezeigt, es geht halt um ein crypt programm und ein programm das mir ohne key entcryptet, quasi ein crack, aber halt noch auf kleiner ebene.

    ->JEtzt habe ich aber eine neue Frage:

    Wie schaffe ich es einen char zu verlgleichen nach einem besonderen muster, also ob nur Buchstben sind oder zum beispiel zahl-buchstabe-zahl-zahl usw..?



  • Schau dir mal die Asciiwerte an.

    Devil



  • std::isdigit std::isalpha etc.



  • Hallo,
    deine Schleifenbedingung while(!in.eof()) ist Käse. So liesst du immer ein Zeichen zuviel. Bedenke: Das eof-bit wird erst gesetzt, *nachdem* eof gelesen wurde.

    Besser:

    char ch;
    while(in.get(ch)) 
    {
    // mach was mit ch
    }
    


  • Original erstellt von HumeSikkins:
    **Hallo,
    deine Schleifenbedingung while(!in.eof()) ist Käse. So liesst du immer ein Zeichen zuviel. Bedenke: Das eof-bit wird erst gesetzt, *nachdem* eof gelesen wurde.

    Besser:

    char ch;
    while(in.get(ch)) 
    {
    // mach was mit ch
    }
    

    **

    Hab das mal so versucht wie du vorgeschlagen hast und leider beschwert sich
    die Win darüber, dass eine Anweisung auf einen ungültigen Speicherbereich
    zeige. Hier mal das gesamte Programm (ist nur ein Test für meine Übung):

    #include <iostream>
    #include <string>
    #include <fstream>
    using namespace std;
    
    void readFile(ifstream);
    
    int main() {
      ifstream in("test.txt");
      readFile(in);
      return 0;
    }
    
    void readFile(ifstream in) {
      int i = 1;
      char ch;
      while(in.get(ch)) {
        cout << "[" << i << "]" << ch << "\n";
        i++;
      }
    }
    

    Wo könnte hier der Fehler liegen?

    Danke im Voraus,
    Khadgar



  • Wo könnte hier der Fehler liegen?

    ifstream hat keinen Copy-Ctor. Das Programm dürfte sich eigentlich nicht mal übersetzen lassen.
    Versuch's mal mit einer Referenzübergabe.



  • und dann in.Clone() aufrufen



  • Hallo,

    ifstream in wird by value übergeben... nachdem die readFile ihre Gültigkeit
    verliert, geht auch der ifstream out of scope und das FileHandle wird abgebaut!
    In deiner main funktion gehst du dann auf ein ungültiges handle.

    Übergebe den stream als Reference dann klappt es problemlos.

    Gruß
    Frank



  • Idee: das ifstream objekt per referenz übergeben

    gruß



  • Dank Euch!!
    Referenzen und Pointer... tztztz. In Java geht das auch so schön ohne 😉
    Naja, muss jedoch nach 4 Wochen C++ schon sagen, dass C++ zumindest teilweise
    toller ist 🙂



  • Kann ich irgendwie anzeigen lassen ob der Pointer am Anfang sitzt? (Von Dateien)

    Weil irgendwie scheint es wieder nicht zu klappen



  • Hi,

    in.tellg() liefert dir die aktuelle dateizeigerposition.

    Gruß
    Frank


Anmelden zum Antworten