[C++] Fenster schließt sich automatisch

@WJoerg

Ich konnte einfach nicht zuschauen, wie diese Frage unbeantwortet bleibt ;)

Stimme euch zu das es wirklich nicht schön ist system oder ähnliches zu verwenden, aber für das was er machen will ist das denk ich ok.

einzig was man noch probieren könnte das es mit cin funktioniert ist folgendes:


cin.sync();
cin.clear(); // oder andersrum...

cin.get();
 
Zuletzt bearbeitet:
--------1.--------
Jetzt bin ich total durcheinander. Ich habe heute erst mit C++ angefangen.
Was genau verwende ich jetzt?
Das der Befehl "system" unsauber ist weiß ich jetzt.

Doch welchen befehl verwende ich jetzt um das Fenster offen zu halten?
#include <conio.h> und getch(); ? oder die sache da mit cin.get .... usw..



--------2.--------

Die einstellung für die IDE habe ich nicht gefunden... kann mir einer das sagen wo die ist für Dev C++ ?

Danke an alle.
 
@mr.coffee
Hast Du es denn nun mal probiert mit dem was PepperJo und ich vorgeschlagen haben?
 
@mr. coffee

Eigentlich ist es ziemlich egal ob du getch() oder cin.get() nimmst das ergebnis sollte das gleiche sein... Einzig du hast noch eine header datei mehr die du einbinden musst (bei getch()) aber bei deiner Programmgröße macht das nichts aus.

probier es mal aus wie ich dir gesagt habe, also in etwa so:

#include <iostream>

using namespace std;

int main()
{

cout<<"HALLO!"<<endl;

cin.sync();
cin.clear();

cin.get();
return 0;
}
 
Geht nicht. Das Fenster bleibt zwar offen aber der nachfolgende code wird ignoriert und das Fenster bleibt dann geschlossen.
Hier der Code
Code:
#include <iostream>
#include <conio.h>                                                            
using namespace std;

int main ()
{
    int zahl1;
    int zahl2;
    
    cout<<"Deine 1. Zahl: ";
    cin>>zahl1;                                                                  
    cout<<"Deine 2. Zahl: ";
    cin>>zahl2;
    cout<<endl;
    cout<<endl;
    cout<<"Deine 2. Zahl: "<<zahl2<<endl;
    cout<<"Deine 1. Zahl: "<<zahl1<<endl;
    cout<<endl;
    getch();                                                           
    cout<<endl;
    cout<<"Gut Gemacht! Programm ENDE";
    getch();                                                                                                                                  
    
}

wo jetzt die beiden getch() sind.. klappt das mit dem anderen nicht.
 
Code:
#include <iostream>
#include <conio.h>                                                            
using namespace std;

int main ()
{
    int zahl1;
    int zahl2;
    
    cout<<"Deine 1. Zahl: ";
    cin>>zahl1;                                                                  
    cout<<"Deine 2. Zahl: ";
    cin>>zahl2;
    cout<<endl;
    cout<<endl;
    cout<<"Deine 2. Zahl: "<<zahl2<<endl;
    cout<<"Deine 1. Zahl: "<<zahl1<<endl;
    cout<<endl;

	cin.sync();
	cin.clear();
    cin.get();     

    cout<<endl;
    cout<<"Gut Gemacht! Programm ENDE";

	cin.get();      
}

Funktioniert bei mir so ohne Probleme.
 
Wenn du das Programm in der IDE öffnest?
Oder wenn du die .exe öffnest?
Oder wenn du über die eingabeaufforderung das Programm aufrufst über C:\......test.exe?
 
Starte es über die IDE, allerdings nicht mit DEV-C++
 
Es hat jetzt auch funktioniert.
Hatte dann wohl was falsch gemacht vorhin.

also vielen Dank.
Ich mach für heute erstmal pause^^ bin denke ich mal weit gegkommen.
gute nacht und danke für eure hilfe
 
mr.coffee schrieb:
Code:
#include <iostream>
using namespace std;

int main ()
{
    int zahl;
    cout<<"Zahl: ";
    cin>>zahl;
    cout<<"Die Zahl: "<<zahl;
    cin.get ();
}

Warum ist das so?

Hi,

kurz und prägnant: du mischt formatierten Input (cin >> zahl) mit unformatiertem Input (cin.get()). Beides insich funktioniert gut, gemischt macht es Ärger.
cin >> ... lässt das abschließende Enter im Eingabestrom, das nächste cin >> ... überliest es einfach. Damit funktioniert es wunderbar. cin.get() stößt das nun auf - was daran liegt, dass es nach anderen Konzepten arbeitet. Deshalb ist das Mischen der eigentliche Fehler.

Zur Sache mit der Betriebssystemabhängigkeit und system - das ist ein betriebssystemabhängiges Problem. Wenn man auf Teufel-komm-raus die Konsole offen halten will, lässt sich das auch nur über betriebssystemspezifische Mittel korrekt lösen. (selbst ein cin.ignore(max_streamsize) hat eine Garantie auf Erfolg, zumal man sich fragen kann, was passiert wenn ein Bandlaufwerk an der Standardeingabe hängt und man möglicherweise zig GB für nix und wiedernix durchnudelt)


Zum cin.clear() und cin.sync() -> cin.clear() setzt die Fehlerbits des Streams zurück, mehr nicht. Und cin.sync() ruf das pubsync des Streambuffers auf, was wiederum ein NoOp ist für einen Eingabestrom. Dabei passiert nichts (bzw. es darf dabei nichts passieren). Das Wegwerfen von Zeichen des Eingabestroms ist imho ein wesentlich schwerwiegenderer Fehler als mal ein system zu benutzen.
 
Zuletzt bearbeitet:
Ok. auch dir nochmal danke für die Erklärung. Ich nehme das ganze jetzt erstmal so hin. Denke das ich das im laufe der Zeit noch alles genauer verstehen werde.
Danke an alle.
 
Wenn cin.sync() ein NoOp sein soll dann probier mal bitte das Prog ohne die Funkt. auszuführen...also bei mir funktioniert es dann nicht.

Aber ich geb dir recht, schön ist das auch nicht, wie ich schon geschrieben habe kann man bei so einfach sachen ruhig system(...) verwenden...
 
edit : war blödsin
 
Zuletzt bearbeitet:
PepperJo schrieb:
Wenn cin.sync() ein NoOp sein soll dann probier mal bitte das Prog ohne die Funkt. auszuführen...
Okay, ganz genau genommen ist es ein Implementierungsdetail deiner IOStreams-Library.

cin.sync erzeugt ein Sentry-Objekt, ruft das pubsync des Stream-Buffers auf, was wiederum die virtuelle Funktion sync des Streambuffers aufruft, die für die Standardeingabe irgendetwas mystisches machen kann - das ist nicht weiter spezifiziert und somit zumindest implementierungsabhängiges Verhalten. Allerdings bezieht sich die Beschreibung vom sync des Streambuffers nur auf die put-Area, während ein Eingabestrom nur mit der get-Area arbeitet. Also sollte dort genau nichts passieren - und falls doch ist das ein Verhalten, was mit deiner aktuellen IOStreams-Library (möglicherweise auch definiert) auftritt, aber nirgendwo anders reproduzierbar sein muss.
 
@PepperJo & Topic

Das mit den Unterschieden is immernch nich ganz richtig!
Wenn die iostream.h eingebunden wird kann man das std:: weglassen (is aber nich sauber c++)
wenn mann die iostream (ohne .h) einbindet muss man das std:: Davorschreiben oder am anfang des Progammes (am besten direkt dach den includes "using namespace std;" schreiben
 
@PumuckelKC:
Und wenn man <iostream.h> einbindet, werden die Prä-Standard-IOStreams benutzt. Die haben z.B. keine Exceptions, verhalten sich alles in allem etwas anders und vertragen sich nicht mit den Standard-IOStreams aus <iostream>. Der Unterschied besteht nicht nur im Namespace! Erstere sollte man also niemals einbinden, sofern der Compiler sie überhaupt (noch) mitliefert.
 
Zurück
Oben