 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Georg Maaß Guest
|
Posted: Sat Sep 04, 2004 8:21 pm Post subject: cin.ignore |
|
|
Hallo,
manchmal will ich alles, was im Eingabestrom ankommt verwerfen. Das
mache ich mit:
cin.ignore(std::string::npos);
Der Aufruf blockiert aber, wenn nichts zum verwerfen anliegt. Kann man
an cin vielleicht irgendwie das Verhalten so einstellen, daß es nicht
blockiert, wenn nichts eingegeben wurde? Bei den Manipulatoren und den
Flags ist mir nichts passendes aufgefallen, was dazu dienen könnte das
cin nicht blockierend zu machen.
Hat das cin keine solche Möglichkeit, oder habe ich sie lediglich nicht
entdeckt?
--
Georg Maaß - bioshop.de D-76227 Karlsruhe, Westmarkstraße 82
HTML, XML / JavaScript, C++, Java, PHP, VB / CGI, JSP, ASP, ASP.net
- The ultimate DHTML engine: http://gml-modul.sourceforge.net -
http://sourceforge.net/projects/gml-modul
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Horst Kraemer Guest
|
Posted: Sun Sep 05, 2004 1:40 am Post subject: Re: cin.ignore |
|
|
Georg Maaß <georg (AT) bioshop (DOT) de> wrote:
| Quote: | Hallo,
manchmal will ich alles, was im Eingabestrom ankommt verwerfen. Das
mache ich mit:
cin.ignore(std::string::npos);
|
Koenntest Du bitte erläutern, was Du mit "alles, was im Eingabestrom
ankommt, verwerfen" meinst ? Was tut dieses Programm ?
--
Horst
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Georg Maaß Guest
|
Posted: Sun Sep 05, 2004 9:58 am Post subject: Re: cin.ignore |
|
|
Horst Kraemer wrote:
| Quote: | Georg Maaß <georg (AT) bioshop (DOT) de> wrote:
Hallo,
manchmal will ich alles, was im Eingabestrom ankommt verwerfen. Das
mache ich mit:
cin.ignore(std::string::npos);
Koenntest Du bitte erläutern, was Du mit "alles, was im Eingabestrom
ankommt, verwerfen" meinst ?
|
Was gibt es da zu erläutern? Auslesen und wegwerfen.
| Quote: | Was tut dieses Programm ?
|
Was das Programm als Ganzes tut, ist irrelevant. Es gibt aber
Situationen, in denen es cin, sofern etwas drin ist, komplett auslesen
muß, um den Inhalt von cin einfach nur zu ignorieren. Wenn aber nix drin
ist und ich trotzdem cin.ignore aufrufe, dann blockiert dieser Aufruf,
bis etwas drin ist, also unter Umständen ewig. das aber kann ich nicht
gebrauchen. Das soll eben nicht blockieren, wenn nix drin ist, sondern
einfach gar nix tun.
--
Georg Maaß - bioshop.de D-76227 Karlsruhe, Westmarkstraße 82
HTML, XML / JavaScript, C++, Java, PHP, VB / CGI, JSP, ASP, ASP.net
- The ultimate DHTML engine: http://gml-modul.sourceforge.net -
http://sourceforge.net/projects/gml-modul
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Sun Sep 05, 2004 2:17 pm Post subject: Re: cin.ignore |
|
|
Georg Maaß wrote:
| Quote: | Horst Kraemer wrote:
Georg Maaß <georg (AT) bioshop (DOT) de> wrote:
manchmal will ich alles, was im Eingabestrom ankommt verwerfen. Das
mache ich mit:
cin.ignore(std::string::npos);
Koenntest Du bitte erläutern, was Du mit "alles, was im Eingabestrom
ankommt, verwerfen" meinst ?
Was gibt es da zu erläutern? Auslesen und wegwerfen.
|
Deine Spezifikation ist widersprüchlich.
Du willst einerseits "alles, was im Eingabestrom ankommt, verwerfen"
(also alles, auch das, was noch nicht eingegeben wurde), und
andererseits "nicht blockieren, wenn nichts zum verwerfen anliegt".
Vermutlich möchtest du das erreichen, was man gemeinhin unter
"Tastaturpuffer leeren" versteht. Das geht mit C++ nicht, da brauchst du
systemspezifische Funktionen.
Wenn du volle Kontrolle über die Eingaben haben willst, bleibt dir
nichts anderes übrig, als zeilenweise zu lesen (getline(cin, str)) und
die Eingaben zu Fuß zu zerlegen (oder an einen stringstream zur weiteren
Verarbeitung zu überantworten).
Stefan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Georg Maaß Guest
|
Posted: Sun Sep 05, 2004 4:28 pm Post subject: Re: cin.ignore |
|
|
Stefan Reuther wrote:
| Quote: | Wenn du volle Kontrolle über die Eingaben haben willst, bleibt dir
nichts anderes übrig, als zeilenweise zu lesen (getline(cin, str)) und
die Eingaben zu Fuß zu zerlegen (oder an einen stringstream zur weiteren
Verarbeitung zu überantworten).
|
Es scheint zu reichen, wenn ich mit poll für fileno(stdin) prüfe, ob in
revents das POLLIN-Flag gesetzt ist, so daß ich nur in diesem Fall, daß
das Bit gesetzt ist, cin.ignore aufrufe.
Zukünftiges brauche ich nicht berücksichten, weil ich an die Stelle nur
komme, wenn ich ohnehin mit einer Fehlermeldung abbrechen möchte, wobei
eben der Webserver die Leerung braucht, weil er sonst die Fehlermeldung
nicht ausgibt, wohingegen die Shell keine solche Leerung braucht bzw.
sie dort, wenn es nichts zu Leeren gibt, sogar stört, weil dann dort das
Programm anhält, statt seine fehlermeldung auszugeben.
--
Georg Maaß - bioshop.de D-76227 Karlsruhe, Westmarkstraße 82
HTML, XML / JavaScript, C++, Java, PHP, VB / CGI, JSP, ASP, ASP.net
- The ultimate DHTML engine: http://gml-modul.sourceforge.net -
http://sourceforge.net/projects/gml-modul
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Edzard Egberts Guest
|
Posted: Sun Sep 05, 2004 7:50 pm Post subject: Re: cin.ignore |
|
|
| Quote: | cin.ignore(std::string::npos);
Der Aufruf blockiert aber, wenn nichts zum verwerfen anliegt. Kann man
an cin vielleicht irgendwie das Verhalten so einstellen, daß es nicht
blockiert, wenn nichts eingegeben wurde? Bei den Manipulatoren und den
Flags ist mir nichts passendes aufgefallen, was dazu dienen könnte das
cin nicht blockierend zu machen.
Hat das cin keine solche Möglichkeit, oder habe ich sie lediglich nicht
entdeckt?
|
if (cin.peek()!= eof()) cin.ignore(std::string::npos);
Um an das eof() zu kommen braucht man noch ein paar Spezifizierer (mit
den Traits kenne ich mich nicht so aus), aber ansonsten müßte das klappen.
HTH,
Ed
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Markus Schaaf Guest
|
Posted: Mon Sep 06, 2004 8:56 am Post subject: Re: cin.ignore |
|
|
"Edzard Egberts" <Ed_03 (AT) t-online (DOT) de> schrieb:
[Georg Maaß schrieb:]
| Quote: | cin.ignore(std::string::npos);
if (cin.peek()!= eof()) cin.ignore(std::string::npos);
|
Kann mir mal bitte einer von Euch beiden erklären, was dieses
»npos« dort soll?
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Edzard Egberts Guest
|
Posted: Mon Sep 06, 2004 10:03 am Post subject: Re: cin.ignore |
|
|
Hallo Markus,
| Quote: | if (cin.peek()!= eof()) cin.ignore(std::string::npos);
Kann mir mal bitte einer von Euch beiden erklären, was dieses
»npos« dort soll?
|
ich habe das ohne weiteres nachdenken übernommen - da müsste aber wohl
numeric_limits<int>::max() stehen. "npos" ist tatsächlich etwas
unglücklich gewählt, da "-1" bei signed Typen nicht die größtmögliche
Zahl darstellt. ;o)
Gruß,
Ed
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Christoph Rabel Guest
|
Posted: Mon Sep 06, 2004 10:06 am Post subject: Re: cin.ignore |
|
|
Edzard Egberts wrote:
| Quote: |
ich habe das ohne weiteres nachdenken übernommen - da müsste aber wohl
numeric_limits<int>::max() stehen.
|
Genaugenommen muss da:
numeric_limits<streamsize>::max()
stehen.
mfg
Christoph
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Georg Maaß Guest
|
Posted: Mon Sep 06, 2004 7:09 pm Post subject: Re: cin.ignore |
|
|
Christoph Rabel wrote:
| Quote: | Edzard Egberts wrote:
ich habe das ohne weiteres nachdenken übernommen - da müsste aber wohl
numeric_limits<int>::max() stehen.
Genaugenommen muss da:
numeric_limits<streamsize>::max()
|
Das Template kennt der alte g++ 2.95.3 nicht. Wenn ich versuche <limits>
oder <limits.h> zu inkludieren, dann findet er auch diese Includes nicht.
Den Typ std::streamsize jedoch kennt er.
Ich werde mal versuchen es so zu formulieren:
cin.ignore(std::string::npos>>1);
Das ist dann die größte positive Zahl, die als std::streamsize
dargestellt werden kann, falls std::streamsize die Vorzeichen behaftete
Variante zu std::string::size_type ist.
Schön ist diese Formulierung nicht, aber das versteht das Fossil
wenigstens, wobei er sich mit dem npos auch wunschgemäß verhielt. Aber
ich werde das auf jeden Fall für die Portierung zum 3er g++ vormerken,
daß das dort dann vernünftig umformuliert wird, denn der kennt die
limits bestimmt, so wie er ja auch die clear-Methode bei strings kennt,
von der das Fossil noch nichts weiß.
Gruß, Georg
--
Georg Maaß - bioshop.de D-76227 Karlsruhe, Westmarkstraße 82
HTML, XML / JavaScript, C++, Java, PHP, VB / CGI, JSP, ASP, ASP.net
- The ultimate DHTML engine: http://gml-modul.sourceforge.net -
http://sourceforge.net/projects/gml-modul
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Edzard Egberts Guest
|
Posted: Mon Sep 06, 2004 8:53 pm Post subject: Re: cin.ignore |
|
|
Hallo Georg,
| Quote: | Ich werde mal versuchen es so zu formulieren:
cin.ignore(std::string::npos>>1);
Das ist dann die größte positive Zahl, die als std::streamsize
dargestellt werden kann, falls std::streamsize die Vorzeichen behaftete
Variante zu std::string::size_type ist.
|
Falls nicht, könnte man aber auch (std::streamsize(-1) >> 1) schreiben.
Gruß,
Ed
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Markus Schaaf Guest
|
Posted: Tue Sep 07, 2004 7:34 am Post subject: Re: cin.ignore |
|
|
"Georg Maaß" <georg (AT) bioshop (DOT) de> schrieb:
| Quote: | numeric_limits<streamsize>::max()
Das Template kennt der alte g++ 2.95.3 nicht. Wenn ich versuche <limits
oder
|
Daß es <limits.h> nicht gibt, halte ich für ein Gerücht.
| Quote: | cin.ignore(std::string::npos>>1);
|
Bitte, was hat dieses »npos« mit »streamsize« zut tun? Ersteres
ist ein »size_t« (mit Sicherheit vorzeichenlos), das andere oft
ein »int« (mit Sicherheit vorzeichenbehaftet). Falls ich
»numeric_limits« nicht benutzen kann, ist »INT_MAX« immer noch
ein guter Kandidat. Kann sogar sein, daß das noch so im Std stand,
in der Urversion.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Georg Maaß Guest
|
Posted: Tue Sep 07, 2004 9:46 am Post subject: Re: cin.ignore |
|
|
Edzard Egberts wrote:
| Quote: | Falls nicht, könnte man aber auch (std::streamsize(-1) >> 1) schreiben.
|
Schiebt das dann nicht links eine 1 rein, weil Vorzeichen behaftet,
womit dann das Resultat immer noch -1 wäre?
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Edzard Egberts Guest
|
Posted: Tue Sep 07, 2004 11:20 am Post subject: Re: cin.ignore |
|
|
Hallo Georg,
| Quote: | Falls nicht, könnte man aber auch (std::streamsize(-1) >> 1) schreiben.
Schiebt das dann nicht links eine 1 rein, weil Vorzeichen behaftet,
womit dann das Resultat immer noch -1 wäre?
|
Nein, es wird immer eine Null eingeschoben, mal ganz davon abgesehen,
dass Deine string::npos-Variante nur eine Umschreibung von "-1" ist
(suche da doch einmal nach der Definition).
streamsize muss auch nicht notwendigerweise der Integer-Darstellung des
Systems entsprechen, sondern darf z.B. ein signed short sein. Wenn Du
dann einen Integer schiebst und der Funktionsaufruf danach auf den short
castet, halte ich es für möglich, dass wieder alle Bits gesetzt sind.
Gruß,
Ed
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Georg Maaß Guest
|
Posted: Tue Sep 07, 2004 1:14 pm Post subject: Re: cin.ignore |
|
|
Edzard Egberts wrote:
| Quote: | Nein, es wird immer eine Null eingeschoben
|
Und wie schiebt mann dann eine 1 von links rein?
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|