Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Kleines Programm mit C++

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ]
010
12.02.2007, 19:55 Uhr
~Gatsch_Snake
Gast


Kann das Programm zwar jetzt ausführen, jedoch wenn ich mit "Enter" bestätige, schließt es sich ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
12.02.2007, 21:15 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Du musst den Puffer leeren

C++:
#include <iostream>

int main(int argc, char* argv[])
{
    float number = 0.0f;
    std::cout << "Zahl eingeben: " << std::flush;
    std::cin >> number;
    std::cout << std::endl << "Ergebnis: " << (number / 25000.0f) << std::endl;
    std::cin.ignore(cin.rdbuf()->in_avail());
    std::cin.get();
    return EXIT_SUCCESS;
}

So ging das glaub. Nicht getestet
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
12.02.2007, 22:05 Uhr
xXx
Devil


hmm hast mein ich noch ein std::cin.clear() vergessen ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
12.02.2007, 22:06 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


hmm...Man kann sich nicht alles merken
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
12.02.2007, 23:27 Uhr
0xdeadbeef
Gott
(Operator)


Das ganze ist eh nur unter Windows von Interesse, von daher helfe ich mir da in der Regel mit

C++:
#ifdef __WIN32__
#include <cstdlib>
#endif

#include <iostream>

int main() {
  double zahl;

  std::cout << "Zahl eingeben: " << std::flush;
  std::cin >> zahl;
  std::cout << "Ergebnis: " << zahl / 25000 << std::endl;
#ifdef __WIN32__
  std::system("pause");
#endif
}


Prinzipiell ist natürlich schöner, das über zeilenbasierte Eingabe zu machen, dann hat man auch keine Probleme mit Fehleingaben. Zum Beispiel:

C++:
#include <iostream>
#include <sstream>
#include <string>

double read_number(std::string const &prompt) {
  double x;
  std::istringstream isstr;
  std::string zeile;

  do {
    std::cout << prompt << std::flush;
    std::getline(std::cin, zeile);

    isstr.clear(); // Hier ist clear() dann notwenig, um die failflags zu clearen
    isstr.str(zeile);
    isstr >> x;
  } while(!isstr);

  return x;
}

int main() {
  double zahl = read_number("Zahl eingeben: ");
  std::cout << "Ergebnis: " << zahl / 25000 << std::endl;

#ifdef __WIN32__
  std::cin.get();
#endif
}


Der Vorteil hier ist, dass keine Reste im Eingabestream bleiben und std::cin.get() das gewünschte tut.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 12.02.2007 um 23:28 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
13.02.2007, 13:59 Uhr
~absoluter anfänger
Gast


ich will euch ja nicht stören beim philosophieren vom programmieren aber ihr vergesst er ist ein anfänger (genauso wie ich) ich bin mir nicht sicher ob ihr ihm statt zu helfen nur noch verwirrt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
13.02.2007, 14:06 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Ok, folgendes. Es gibt da einen "Workaround", damit sich die Konsole nicht schließt. Man liest einfach am Ende des Programmes noch einmal eine Eingabe vom Eingabestream std::cin (STDIN). Damit ist das Programm erst beendet, wenn man am Ende nochmal Enter gedrückt hat. Dies geht aber nur, wenn der Stream leer ist, da das Programm dann nicht auf die eingabe wartet - da es ja bereits etwas hat. Deswegen muss man den Puffer leeren und dann std::cin.get(); vor das return schreiben. Das ist eigentlich alles. Keine große Hexerei und auch nicht wirklich kompliziert. Nur das leeren des eingabestreams ist halt etwas kryptisch ...


C++:
#include <iostream>

int main(int argc, char* argv[])
{
    float number = 0.0f;
    std::cout << "Zahl eingeben: " << std::flush;
    std::cin >> number;
    std::cout << std::endl << "Ergebnis: " << (number / 25000.0f) << std::endl;
    std::cin.clear();
    std::cin.ignore(cin.rdbuf()->in_avail());
    std::cin.get();
    return EXIT_SUCCESS;
}


Das sollte Einwandfrei funktionieren - ebenso wie die snippets von Beefy. Ich persönlich vermeide system halt so gut es geht ... Deshalb mag ich system("pause")nicht. Und getche() aus conio.h ist halt nicht ansi. std::cin.get() hongegen schon
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
13.02.2007, 14:13 Uhr
0xdeadbeef
Gott
(Operator)


std::cin.rdbuf()->in_avail() gibt allerdings lediglich die Anzahl an Bytes im streambuf-Objekt, das std::cin hält an, nicht die Anzahl der Bytes in stdin. Auf einer ganzen Reihe von Plattformen ist std::cin an der Stelle ungebuffert, d.h. du kriegst damit 0. Immer.

So oder so, das ist eine höchst unzuverlässige und unportable Lösung. Am sinnvollsten ist hier, die Eingabe so zu verarbeiten, wie sie gemeint ist - zeilenweise.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
13.02.2007, 14:24 Uhr
Suba Esel



@ ~absoluter Anfänger: da kann ich dir nur zustimmen!
@ J-jayz-Z: IMO kann man das
C++:
std::cin.clear();
    std::cin.ignore(cin.rdbuf()->in_avail());
auch durch ein einfaches
C++:
std::cin.sync();
ersetzen.
--
Simon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
13.02.2007, 14:34 Uhr
0xdeadbeef
Gott
(Operator)


std::cin.clear() cleart lediglich die Fehlerflags, das ist nur dann von Interesse, wenn beim Auslesen ein Fehler aufgetreten ist - z.B. wenn du ne Zahl erwartest und dir ein "abc" gegeben wird.

std::cin.rdbuf()->in_avail() ist, ich sags noch einmal, nicht zuverlässig, weil es sich dabei um eine in der Praxis völlig uninteressante Eigenschaft des streambuf-Objekts handelt.

std::cin.sync() schmeißt ebenfalls nur den Buffer im streambuf-Objekt weg, bei ungebuffertem std::cin macht das rein garnichts. Keine der "Lösungen" ist in irgendeiner Weise für Kommandozeileneingaben geeignet.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: