cin Puffer
-
int x; cin >> x;Ich kann ja jetzt so viele Zahlen eintippen wie ich lustig bin. Alles das ich eintippe landet in einem Puffer, und wird erst geflusht, wenn ich Enter drücke. Ist das korrekt? Falls ja, dann kann der Puffer doch theoretisch irgendwann überlaufen.
-
Gugelmoser schrieb:
Alles das ich eintippe landet in einem Puffer, und wird erst geflusht, wenn ich Enter drücke. Ist das korrekt?
Jain. Der Standard macht darüber keine Aussage, das gehört also weder zu C++ noch zu deinem Programm im engeren Sinne und ist Sache des Betriebssystems. Dieses wird allerdings irgendeine maximale Puffergröße haben, ab der du nichts mehr eintippen kannst. Ob du die rausfinden willst ist eine andere Sache.

-
Das läge weit, weit außerhalb des Einflussbereichs der C/C++-Runtime (da cin intern stdin als Quelle benutzt, benutzt es indirekt die C-Runtime), sondern ist normalerweise Sache des Betriebssystemkernels. Der wird technisch irgendwo eine Grenze haben, bei Linux ist das soweit ich weiß eine Speicherseite (also 65kB). Der Puffer deines Programms sagt nach außen bloß "Du willst mir was geben? Ja, nur her damit." oder "Du willst mir was geben? Nein, warte mal, ich bin voll".
-
Du liest zu viele Science-Fiction Romane. Mag sein, dass das einige Compiler als Extension anbieten, aber Standard-C++ kennt keine Pufferüberläufe.
-
Ich glaube, ich habe wirklich etwas grundsätzliches nicht verstanden. Darum fang ich jetzt mal ganz von vorne an:
Ich lese im Moment meine erstes C++ Buch. Da steht nun folgendes:
Das Schreiben (ofstream) geschieht gepuffert, indem in einen dafür reservierten Speicherbereich (Puffer) geschrieben wird, der erst bei Überlauf oder bei Aufruf von close() auf die Festplatte transferiert wird.
Das habe ich verstanden. Dann steht aber noch dran, dass fürs Lesen (ifstream) analoges gilt. Und das habe ich nicht ganz verstanden. Inwiefern analoges?
{ ifstream in("test.txt"); } // closeLädt diese Anweisung nun den Inhalt der File in einen Puffer? Falls ja, wohin soll der Inhalt des Puffers nun transferiert werden?
-
Gugelmoser schrieb:
{ ifstream in("test.txt"); } // closeLädt diese Anweisung nun den Inhalt der File in einen Puffer? Falls ja, wohin soll der Inhalt des Puffers nun transferiert werden?
Kann sin, dass da was gepuffert wird, wird in den meisten Fällen auch so sein. Aber meistens auch erst, nachdem du anfängst, irgendwo zu lesen, dann wird im Puffer noch das gerade gelesene bereit gehalten und eventuell auch schon ein bisschen weitergelesen, während dein Programm noch arbeitet. An der Stelle wo die Datei geschlossen wird, wird der Inhalt eines eventuellen Puffers verworfen (da der ifstream nix rausschreiben kann). Aber was hat dieses Beispiel mit deiner Frage zu tun?
-
SeppJ schrieb:
Aber was hat dieses Beispiel mit deiner Frage zu tun?
Eine gute Frage. Ich hab keine Ahnung mehr auf was für einem Trichter ich war, als ich den Thread gestartet hab. Im Endeffektf ist eh nur wichtig zu wissen, dass bei
ofstreamder Inhalt erst dann in die Datei geschrieben wird, wenn siegeschlossenwird.
-
Gugelmoser schrieb:
dass bei
ofstreamder Inhalt erst dann in die Datei geschrieben wird, wenn siegeschlossenwird."erst dann" ist nicht richtig. "auch dann" wäre passend. Es gibt durchaus auch andere Ereignisse, die einen sync auslösen können.
-
Wie- und ob gepuffert wird, hängt von der
streambuf-Implementierung ab, die der Stream benutzt. Es kann auch sein, dass gar nicht gepuffert wird.
-
@Gugelmoser: Hast du ein konkretes Problem, weil du MBytes mit cin lesen musst, oder ist das nur so gefragt? Weil bestimmt gibt es einen Überlauf, aber "new" kann auch NULL zurückgeben und Hand auf's Herz, wer überprüft das immer?
Eine interessantere Frage wäre, was ist, wenn ich mit cin >> num; eine Zahl einlese, die in num nicht mehr reinpasst.
-
PhilippHToner schrieb:
@Gugelmoser: Hast du ein konkretes Problem, weil du MBytes mit cin lesen musst, oder ist das nur so gefragt?
Nein, es war nur eine Frage rein aus Interesse.

-
PhilippHToner schrieb:
aber "new" kann auch NULL zurückgeben
Nein, kann es nicht.
-
314159265358979 schrieb:
PhilippHToner schrieb:
aber "new" kann auch NULL zurückgeben
Nein, kann es nicht.
Klar kann es das. Man muss das halt anfordern.
-
Ich weiß. Die Rede ist hier trotzdem von plain new, und du weißt das ganz genau

-
314159265358979 schrieb:
Ich weiß. Die Rede ist hier trotzdem von plain new, und du weißt das ganz genau

Dann sag nicht "Nein, kann es nicht.", denn dass ist schlichtweg falsch, sondern schreibe sowas wie "Aber nur, wenn man es explizit fordert". Dann kackt Dir auch keiner ans Bein.
-
Nur weil du mich nicht magst, musst du nicht gleich darauf rumreiten. Du weißt ja offenbar ganz genau, was ich gemeint habe.
-
314159265358979 schrieb:
Nur weil du mich nicht magst, musst du nicht gleich darauf rumreiten. Du weißt ja offenbar ganz genau, was ich gemeint habe.
Ehrlich gesagt finde ich Dich gar nciht so schlimm. Nur Deine absoluten Aussagen sind oft einfach Schwachfug. Und Du lässt Dich auch nur extrem schwer eines Besseren belehren. Arbeite da dran, und dann bist Du gar nicht so übel.
-
Meine Aussage war nicht absolut sondern Kontext-abhängig.
-
314159265358979 schrieb:
PhilippHToner schrieb:
aber "new" kann auch NULL zurückgeben
Nein, kann es nicht.
#define new NULL; //Jetzt sogar immer!
Nein stimmt schon, es war nicht ganz richtig. Ich müsste den new operator selber bauen und keine exception schmeissen, sondern NULL zurückgeben. Trotzdem finde ich gehört es zur guten Programmiermanier, dass man Pointer überprüft. Ist ja jetzt auch nicht das zentrale Thema.
-
PhilippHToner schrieb:
#define new NULL; //Jetzt sogar immer!
Ney.