Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Flächeninhaltsrechner

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 <
010
07.11.2009, 23:36 Uhr
der_evo



Er mosert nicht und es klappt trotzdem nicht
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
08.11.2009, 01:28 Uhr
Hans
Library Walker
(Operator)


dann fällt mir dazu gerade nichts mehr ein.
Eine weitere Möglichkeit wäre noch, ständig ein Fenster mit der "Eingabeaufforderung" offen zu halten, und das Programm immer von dort aus aufzurufen. D.h. mit der Entwicklungsumgebung schreibst Du das Programm, und lässt es übersetzen, nur startest Du es nicht daraus. Stattdesen wechselst Du dann zu dem Fenster "Eingabeaufforderung" und rufst es von dort auf. Dann brauchst Du Dir auch keine Sorgen darum zu machen, dass das Fenster wieder geschlossen wird, wenn Dein Programm beendet wurde, und kannst auf entsprechende Massnahmen am Ende ganz verzichten.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
08.11.2009, 01:34 Uhr
0xdeadbeef
Gott
(Operator)


Was passiert ist folgendes: Beim Einlesen

C++:
int x;
std::cin >> x;


wird nur die Zahl aus dem Stream gelesen. Das heißt, du gibst etwa "123<enter>" ein, dann befindet sich im Stream der String "123\n", und nach dem Auslesen der Zahl noch "\n", was beim nächsten std::cin.get()-Aufruf ausgelesen wird. Wenn du etwa "123 abc<enter>" eingibst, noch " abc\n".

Ich behandle Konsoleneingaben deshalb und um Fehleingaben abzufangen gerne zeilenweise, wie ich weiter oben beschrieben habe. Unter der Annahme, dass sich aber nur eine Zeile im Stream befindet, was bei Konsoleneingaben normal ist, kann man auch folgendes machen:

C++:
#include <iostream>
#include <limits>

int main() {
  int x;
  std::cin >> x;

  // Jetzt:
  std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  std::cin.get();
}


Dabei ist

C++:
std::numeric_limits<std::streamsize>::max()


der maximale Wert, den std::streamsize (der Größentyp in den Streams der Standardbibliothek) annehmen kann, und

C++:
  std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');


sagt "Ignorier die Zeichen in std::cin, bis du ein '\n' findest, aber höchstens std::numeric_limits<std::streamsize>::max()", mit anderen Worten, ignorier die Zeichen in std::cin bis zum nächsten '\n'. Danach wartet std::cin.get() im jetzt leeren Stream auf ein Zeichen, bei gebufferter Eingabe also auf Enter.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
08.11.2009, 04:33 Uhr
Hans
Library Walker
(Operator)


@beefy: Das wäre also die saubere und systemunabhängige C++ Variante um den Puffer des Eingabestroms (input-stream) zu leeren, wo man in C unter Windows öfter mal "fflush(stdin);" findet, richtig?

@evo: eine kurze Erläuterung, was ein Stream ist: Stream bedeutet Strom, im Sinne von fliessen, wie zum Beispiel ein Fluss fliesst. Alle Daten, die im Computer verarbeitet werden, werden als solche (Daten-)Ströme aufgefasst. Man unterscheidet dabei zwischen Datenströmen, die in den Computer hinein "fliessen" (input-stream) und solche, die wieder heraus "fliessen" (output-stream). Von wo die Eingabedaten kommen, ist dabei unwichtig: das kann die Tastatur sein oder eine Diskette, eine CD oder ein Modem, ein USB-Port oder sonst eine Schnittstelle. Wichtig ist lediglich, das die Daten, die man in einem Programm entgegen nimmt, über diesen Eingabestrom kommen. Bei der Ausgabe verhält es sich genau so: Alles, was man ausgibt landet in den Ausgabestrom. Von dort wird es dann an den Monitor, ein Speichermedium oder sonstwas weiter geleitet. Der Vorteil von diesem Konzept ist, das man sich als Entwickler nicht um die Details kümmern muss, wie die Daten herein oder hinaus kommen. Dafür ist das Betriebssystem zuständig, das einem diese Arbeit abnimmt. Es sorgt dafür, dass die Daten dorthin weiter fliessen, wo das Programm (d.h. der Entwickler eines Programms) sie hin haben will. Um die genauen Einzelheiten, also wie z.B. die Bits auf die Festplatte gelangen, kümmern sich dann die Treiber die für ein Gerät zuständig sind. Soweit mal eine kurze Erläuterung, die nun doch schon wieder länger geworden ist, als gedacht.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
08.11.2009, 18:54 Uhr
0xdeadbeef
Gott
(Operator)


Nicht ganz, nein - fflush(eingabestrom) mit Microsoft-Bibliotheken leert den mit dem Eingabestrom verbundenen Puffer vollständig. Was da drin ist, ist dabei stark von den Umständen abhängig - wenn etwa jemand stdin auf eine Datei umleitet, möchte ich mich nicht dafür verbürgen, was nach fflush(stdin); noch im Stream vorhanden ist, und das gleiche gilt, wenn jemand mit den Konsoleneinstellungen herumspielt. Mein Beispiel oben ignoriert lediglich bis zum nächsten Zeilenende.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 08.11.2009 um 18:55 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ 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: