Variable lässt sich nicht speichern



  • Hi,
    ich bin ja eigentlich Java-Progger, aber C++ interessiert mich auch und so habe ich etwas rumprobiert:

    #include <iostream.h>
    #include <conio.h>
    #include <fstream.h>
    
    class KlassenTest{
          private:
          char string[64];
    
          public:
          void setString(char *variable){
    
               while(*string != '\0'){
               *string = *variable++;
               cout << *string;
    
               }
    
               ofstream out("datei.txt");
               out << string <<endl;
          }
    };
    
    void main(){
    char hallo[6] = "Hallo";
    
    KlassenTest test;
    test.setString(hallo);
    
    getch();
    }
    

    Die Datei wird zwar erstellt, aber es wird nichts reingeschrieben. Es klappt nur, wenn ich einen String direkt reinschreibe (z.B. "Hallo Welt!").

    Liebe Grüße
    Real



  • Du erhöhst variable ja in jedem Schleifendurchlauf. Was passiert ist, dass du string[0] jeweils auf das Zeichen setzt, auf das variable zeigt, und dann variable erhöhst, so lange, bis variable auf 0 zeigt. string selbst bleibt aber bis auf das erste Zeichen unverändert.

    Unabhängig davon sind noch einige andere Unschönheiten in dem Programm drin. Versuchs mal so:

    #include <fstream> // Standard-Header einbinden. auf conio.h schön verzichten.
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class KlassenTest {
      private:
        string m_string;
    
      public:
        void setString(string const &s){
          m_string = s; // das wolltest du wahrscheinlich
    
          ofstream out("datei.txt");
          out << m_string << endl;
        }
    };
    
    int main() { // main ist _immer_ int.
      string hallo = "Hallo";
    
      KlassenTest test;
      test.setString(hallo);
    
      cin.get();
    }
    


  • Du erhöhst den Index von string ja nie und string wird erst 0 sein, wenn das letzte Zeichen an die erste Position von string geschrieben wurde.
    Sprich wenn deine While-Schleife fertig ist sieht dein string so aus: string[0] = '\0'; und die Elemente dahinter wurden nie verändert.
    In deiner Datei steht daher auch nichts drin.

    Verwende einfach strcpy aus string.h, oder du programmierst richtig C++ und schaust dir erst einmal dieses Tutorial an.



  • Hi,
    danke für eure Antworten! 🙂
    Ich habe mal die Methode von Oxdeadbeef genommen (Dich kenne ich übrigens von java-forum.org 😉 ).

    0xdeadbeef schrieb:

    #include <fstream> // Standard-Header einbinden. auf conio.h schön verzichten.
    

    Weil conio.h compilerspezifisch ist?

    int main() { // main ist _immer_ int.
    

    Warum? In meinem (uraltem) Buch ist das auch so.

    Liebe Grüße
    Real



  • 0xdeadbeef schrieb:

    #include <fstream> // Standard-Header einbinden. auf conio.h schön verzichten.
    

    Weil conio.h compilerspezifisch ist?

    korrekt

    Zitat:

    int main() { // main ist _immer_ int.
    

    Warum? In meinem (uraltem) Buch ist das auch so.

    Das ist in vielen älteren Büchern so, ist aber definitiv nicht standard-konform - der schreibt int als Rückgabetyp vor.

    Mfg, smasher1985



  • seit 1998 ist void main depreciated(oder sogar verboten?)



  • Danke für die Antworten. 🙂

    Liebe Grüße
    Real



  • ANSI-C definiert als mögliche Formen für main schon seit 1989

    int main(void);
    int main(int argc, char *argv[]);
    

    Diese beiden Formen muss jeder Compiler implementieren. Wenn du ne andere Form benutzt, ist es Glückssache, ob der Compiler das mag oder nicht. Also lass es.



  • otze schrieb:

    seit 1998 ist void main depreciated(oder sogar verboten?)

    void main war nie vom Standard vorhergesehen. Aber AFAIK darf der Compiler auch andere Formen von main zulassen. Das ist dann aber nicht portabel! (Oder war das bei C99 so?)



  • Wah, falscher Knopf. Was ich noch dazu sagen wollte: Der ISO-C++-Standard von 1998 dagegen definiert

    int main();
    int main(int argc, char *argv[]);
    

    Das vor allem deswegen, weil int foo(void) in C++ eine ungewöhnliche Syntax ist. In C bedeutet int foo() eine Funktion foo, die int returnt und beliebig viele Parameter annimmt, in C++ ist int foo() eine parameterlose Funktion foo die int zurückgibt. In C schreibst du eine parameterlose Funktion int foo(void), was in C++ zwar noch legal, aber eigentlich ziemlich sinnlos ist. int main(void) muss ein C++-Compiler nicht zwingend erlauben, von daher schreib in C++-Programmen einfach

    int main()
    

    damit bist du auf der sicheren Seite.


Anmelden zum Antworten