int Variable gibt komische Zahl aus. (Anfänger)



  • Moin zusammen,

    und zwar möchte ich mir in einer kleinen Funktion unter anderem die Anzahl der Zeichen eines Textes ausgeben lassen.
    Die Variable counter gibt aber nicht die Zeichen aus (Sollte normal 12 sein), sondern bei "int counter" 2293210 und bei "short int counter" 15.

    Warum kriege ich bei "int" und "short int" verschiedene Zahlen raus ?
    Und warum erhalte ich nicht das richtige Ergebnis ?

    Vielen Dank für eure Hilfe

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    void write_file(string dateiname, string text);
    void read_file(string dateiname);
    
    int main(){
    
        write_file("test.txt","abcdefg12345");
        read_file("test.txt");
    
    return 0;
    }
    
    void write_file(string dateiname, string text){
    
        ofstream output;
    
        output.open(dateiname.c_str(), ios_base::out);
    
        output << text << endl;
    
        output.close();
    
    }
    
    void read_file(string dateiname){
    
        ifstream input;
    
        input.open(dateiname.c_str(), ios_base::in);
    
        char zeichen;
        int counter;
    
        while(!input.eof()){
    
            counter++;
            input.get(zeichen);
            cout << zeichen;
    
        }
    
        cout << counter << " Zeichen";
    
        input.close();
    
    }
    

  • Mod

    Variablen haben nicht den Wert 0, wenn du sie anlegst, sondern einen Wert der zufällig gerade im Speicher steht. Du musst deinem Zähler erst einen Anfangswert zuweisen, bevor du ihn benutzt.

    edit: Und noch eine kleine Bemerkung:

    Die Schleife

    while(!input.eof()){
          counter++;
          input.get(zeichen);
          cout << zeichen;
    }
    

    wird nicht das tun, was du wahrscheinlich erwartest. Denn wenn das letzte Zeichen der Datei gelesen wurde, ist noch nicht input.eof(), sondern erst, nachdem versucht wird über das Ende hinus zu lesen. Das heißt, dass das letzte get, welches versucht über das Ende zu lesen, fehlschlägt, du aber trotzdem hochzählst und ausgibst. Eine einfache Möglichkeit dies zu verhinden ist folgendes:

    while(input.get(zeichen)){
          counter++;
          cout << zeichen;
    }
    


  • Ah vielen Dank SeppJ. Hast mir sehr weiter geholfen.

    Das Variablen ohne Initialisierung nicht den Wert 0 haben, hätte ich nicht gedacht. Gut zu wissen 😃

    Das mit der Schleife hatte ich mir schon beinahe denken können. Danke für den Lösungsvorschlag, ich werde es in Zukunft so einsetzen.

    Grüße,
    SalamiDealer



  • #include <iostream>
    #include <fstream>
    #include <string> //hattest du vergessen
    using namespace std;
    
    void write_file(const char* dateiname, const std::string &text);
    void read_file(const std::string &dateiname);
    //google: passing by copy/value
    
    int main()
    {
      write_file("test.txt", "abcdefg12345");
      read_file("test.txt");
    }
    
    void write_file(const char* dateiname, const std::string &text)
    {
      ofstream output(dateiname);
      output << text << endl;
    }
    
    void read_file(const char* dateiname)
    {
      ifstream input(dateiname);
    
      int counter = 0;
      for(char zeichen; input.get(zeichen); ++counter)
        cout << zeichen;
    
      cout << counter << " Zeichen";
    }
    

    bb

    PS: Wie du gesehen hast, hab ich ein wenig weggelassen - war nicht wirklich alles nötig... statt int counter würde ich auch size_t counter nehmen



  • Hi unskilled, danke für deine Mühe.
    Ein paar Sachen verstehe ich in deinem Code nicht. Ich stehe noch ziemlich am Anfang 😃 Aber ich werde es mir mal durchgucken.

    Lg
    SalamiDealer


  • Mod

    SalamiDealer schrieb:

    Hi unskilled, danke für deine Mühe.
    Ein paar Sachen verstehe ich in deinem Code nicht. Ich stehe noch ziemlich am Anfang 😃 Aber ich werde es mir mal durchgucken.

    Lg
    SalamiDealer

    Frag ruhig nach, wenn dir was unklar ist.


Anmelden zum Antworten