In Variablen speichern



  • Hallo zusammen!

    Hab kurz ne richtig einfache(oder hoffe ich jedenfalls) Frage, bin aber absoluter C++ Anfänger.

    #include <iostream>
    using namespace std;
    
    int main()
    {
    int zahl = 1;
    cout<<"Zahl: "<<zahl<<endl;
    cin>>zahl;
    cout<<"Sie haben: "<<zahl<<" eingegeben."<<endl;
    
    return 0;
    }
    

    Also: Ich hab z.B. eine Variable vom Typ Integer und in meinem Code wird in der was abgespeichert. Ich weise in dem Beispiel oben "zahl" z.B. den Wert 5 zu. Wenn ich jetzt C++ neu starte, ist der Wert der Variable jedoch wieder 1. Wie bekomme ich es hin, dass die 5 auch wirklich in "zahl" gespeichert bleibt??? 😕 😮
    Wäre dankbar für Hilfe,

    grüße Müllfanatiker



  • Das wird nicht funktionieren. Nach dem dein Programm beendet wird, oder besser gesagt der Gültigkeitsbereich verlassen wird, gehen auch die Werte in deinen Variablen verloren.

    Der Gültigkeitsbereich ist immer innerhalb der geschweiften Klammern.



  • Offentsichtlich auch Programmier- und Computer-Anfänger. 🙂

    Was glaubst du denn wo sich deine Variablen nach Programmende befinden könnten ??

    mfg JJ



  • Hallo

    Ich bin zwar auch noch Anfänger. Du könntest aber den Wert der Variable in einer Datei speichern. Wie das genau geht weis ich auch noch nicht so richtig
    aber ich hoffe ich konnte die helfen.



  • Steve O. schrieb:

    Ich bin zwar auch noch Anfänger. Du könntest aber den Wert der Variable in einer Datei speichern. Wie das genau geht weis ich auch noch nicht so richtig

    Schau mal in die FAQ, da findest Du alles, was Du wissen musst, um sowas zu implementieren.



  • Ich meinte ich habe mich mit dem Thema noch nicht so richtig befasst. Ich hab Bücher wo ich sowas mal nachschauen bzw. lernen kann. Wenn ihr noch ein wenig wartet dann kann ich mal sowas versuchen und euch dann hier präsentieren.



  • So hab ma was ausprobiert.

    #include<iostream>
    #include<fstream>
    #include<string>
    using namespace std;
    
    int var=0;
    string datei="variable.dat";
    
    int main()
    
    {
    
    	cout << "Wert von Variable: " << var << endl;
    
    	cout << "Gib einen neuen Wert fuer die Variable ein: ";
    
    	cin >> var;
    
    	ofstream dat_aus;
    
    	dat_aus.open(datei.c_str(), ios_base::out);
    
    	dat_aus << var << endl;
    
    	dat_aus.close();
    
    	return 0;
    
    }
    

    Wenn man das Programm beendet dann wird die Variable in einer Datei gespeichert. Die Datei befindet sich dann im Projekt-Ordner. Jetzt fehlt nur noch das der Wert für die Variable am Anfang des Programms ausgelesen wird.



  • Steve O. schrieb:

    So hab ma was ausprobiert.

    ofstream dat_aus;
    
    	dat_aus.open(datei.c_str(), ios_base::out);
    
    	dat_aus << var << endl;
    
    	dat_aus.close();
    
    	return 0;
    
    }
    

    Das schreibt man anders:

    ofstream dat_aus(datei.c_str());
      dat_aus << var << '\n';
      return 0;
    }
    

    Also direkt mit dem Konstruktor öffnen.
    Das close() ist unnötig, weil das der Destruktor erledigt.
    Das endl ist auch nicht nötig, weil spätestens beim Schließen der Datei ohnehin geschrieben wird (ist bei dem Beispiel natürlich relativ egal).



  • Naja wie gesagt ich bin noch Anfänger und hab des Meiste aus nem Buch abgeschrieben. Trotzdem Danke. Und wie liest man dann aus Dateien? Danke im Voraus.



  • Mit ifstream.
    Beispiel:

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    // Liest die (TXT)Datei aus, die als erstes Argument uebergeben wurde.
    int main(int argc, char* argv[])
    {
            if(argc == 2)
            {
                    ifstream infile(argv[1]);
                    if(infile.is_open())
                    {
                            cout << "\n Inhalt der Datei " << argv[1] << endl << endl;                
                            char c;
                            while(infile.get(c))
                                    cout << c;
                    }
                    else
                            cout << "\n Datei konnte nicht zum lesen geoeffnet werden" << endl;        
            }
            return 0;
    }
    

    Caipi



  • DrGreenthumb schrieb:

    Das schreibt man anders:

    ofstream dat_aus(datei.c_str());
      dat_aus << var << '\n';
      return 0;
    }
    

    Also direkt mit dem Konstruktor öffnen.
    Das close() ist unnötig, weil das der Destruktor erledigt.
    Das endl ist auch nicht nötig, weil spätestens beim Schließen der Datei ohnehin geschrieben wird (ist bei dem Beispiel natürlich relativ egal).

    Ist trotzdem nicht falsch, wenn er es nicht gleich im Ctor macht. Wäre es falsch, würde es einen Compile-Error geben, nicht wahr? 😃

    Das close() ist in DEM Fall redundant, aber er kann es trotzdem dann aufrufen, wenn ER es will. Weil, es kann ja sein, das der Gültigkeitsbereich noch nicht verlassen wird, aber er es trotzdem schon schliessen will.

    Würde an deiner Stelle es nicht als "falsch" verkaufen, sondern nur als unschön.



  • //...
    int main(int argc,char* argv[])
    //...
    

    dann müsste man aber dazusagen, dass das programm dann so aufgerufen werden muss:

    programm.exe datei.txt



  • @Caipi:
    zwei kleine hinweise:
    statt is_open ginge auch nur

    if (infile)
    

    und statt zeichen für zeichen via get einzulesen kann man auch den buffer eines streams direkt auf einem anderen ausgeben (via operator<<)

    cout << infile.rdbuf();
    

    aber das ist nur herumgehacke auf kleinigkeiten...



  • davie schrieb:

    @Caipi:
    zwei kleine hinweise:
    statt is_open ginge auch nur

    if (infile)
    

    Hem, und warum? 😕



  • weil der op() ueberschrieben ist



  • etwas genauer:
    basic_ios definiert operator void* und operator!. in dem ausdruck

    if (infile);
    

    wird infile daher zu void* konvertiert. operator void* liefert einen nullzeiger, wenn das failbit gesetzt ist (andernfalls einen anderen, nicht 0-zeiger). und das failbit wird von einem fstream u.a. dann gesetzt, wenn dessen buffers open-methode fehlschlägt. (d.h. einen nullzeiger zurückliefert).
    alles klar?



  • Aha! Hab ich nicht gewusst. Danke! 🙂



  • Cool und kann man den Buffer eines Streams dann auch via Operator einer Variable übergeben. Wenn ja wie? Danke im Voraus.

    Steve O.



  • ich verstehe nicht ganz, was du tun willst (den buffer eines streams einer variable übergeben via operator) ...



  • Ich meine das Ganze in etwa so:

    variable << infile.rdbuffer();
    

    Ich hoffe du weist was ich meine. Danke schonmal.

    Steve O.


Anmelden zum Antworten