Gibt es eine Möglichkeit, einen Blick auf die stdin-Puffer?
Wissen wir, dass stdin
ist standardmäßig eine gepufferte Eingabe; der Beweis dafür ist in der Verwendung der Mechanismen, die "überlassen von Daten" auf stdin
wie scanf()
:
int main()
{
char c[10] = {'\0'};
scanf("%9s", c);
printf("%s, and left is: %d\n", c, getchar());
return 0;
}
./ein.aus
Hallo
Hallo, und Links ist 10
10
als newline natürlich...
Ich war schon immer neugierig, gibt es eine Möglichkeit, Sie zu "peek" an der stdin
Puffer ohne entfernen von was auch immer kann, dort zu wohnen?
BEARBEITEN
Ein besseres Beispiel wäre:
scanf("%9[^.]", c);
Mit einer Eingabe "an.ct", jetzt habe ich "Daten" (ct\n
) Links auf stdin
, nicht nur ein Zeilenumbruch.
- Sie können
ungetc()
nach gucken. Gut genug? - Ich denke, es ist nicht schlecht... Was ist, wenn gab es eine ganze Reihe von Zeichen Links? Kann ich wissen, die Länge der Daten, Links auf stdin? oder könnte ich
ungetc()
mehr als einen Charakter? - "Ein Zeichen der pushback ist garantiert. Wenn die
ungetc
Funktion wird aufgerufen, zu viele Male auf dem gleichen stream ohne zwischengeschalteten Lesen oder Datei-Positionierung Betrieb auf dem stream, kann der Vorgang fehlschlagen." In der Regel können Sieungetc
mehr als eine, aber nur eine ist garantiert. - Nach denken für eine Weile, ich Stimme mit Ihrer Antwort (hier in den Kommentaren) als die beste Lösung, um zu wissen, was auf
stdin
. Kannst du es als Antwort, so kann ich das annehmen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tragbar, können Sie das nächste Zeichen in der Eingabe-stream mit
getchar()
und dann schieben Sie es zurück mitungetc()
, die Ergebnisse in einem Zustand, als ob der Charakter war nicht entfernt aus dem stream.Nur ein Zeichen der pushback ist garantiert der standard, aber in der Regel, Sie schieben zurück mehr.
Wie bereits in den anderen Antworten resp. die Kommentare dort in der Praxis, können Sie fast sicher Blick auf die Puffer, wenn Sie Ihre eigenen Puffer mit
setvbuf
, obwohl das nicht ohne Probleme:dass die Möglichkeit offen lässt, dass der bereitgestellte Puffer darf nicht benutzt werden.
das heißt, Sie haben keine Garantie, dass der Inhalt des Puffers spiegelt die tatsächliche Eingangs - (und es macht die Nutzung der buffer undefiniert Verhalten, wenn es hat automatische Speicherdauer, wenn wir wählerisch).
In der Praxis ist jedoch das prinzipielle problem wäre, herauszufinden, wo im Puffer werden die noch nicht verbrauchten Teil der gepufferten Eingabe beginnt und wo es endet.
getchar
wenn der Eingabepuffer leer ist blockiert, bis es etwas zu Lesen?Wenn Sie wollen, schauen Sie sich die
stdin
Puffer, ohne es zu verändern, man könnte sagen, ein anderer Puffer mitsetbuf
, mit einem array können Sie zugreifen:Diesem dich sehen lassen, etwas mehr als
ungetc
, aber ich glaube nicht, dass Sie weiter gehen kann in einer tragbaren Weise.Eigentlich ist dies legal, aber ist nicht richtig für die standard, zitiert aus es über die
setvbuf
(setbuf
hat das gleiche Verhalten):Also das ist nicht das, was Sie benötigen, wenn Sie suchen für eine vollständige Portabilität und standard-compliance, aber ich kann mir nicht vorstellen, warum die Puffer sollten nicht enthalten, was erwartet wird. Jedoch, es scheint zu funktionieren auf meinem computer.
Beachten Sie, dass Sie haben, um ein array von mindestens
BUFSIZ
Zeichensetbuf
, und Sie müssen nicht alle I/O-operation auf dem stream vor. Wenn Sie mehr Flexibilität benötigen, werfen Sie einen Blick aufsetvbuf
.Konnten Sie Ihre eigenen Puffer mit
setvbuf
über stdin und peek dort, Wann immer Sie wollen.ungetc
? Ich Schätze, dasungetc
ed Charakter gespeichert ist, in einigen anderen Variablen. Auch, wie würden Sie wissen, was Teil des Puffers Lesen und was ist Links?The setvbuf() function has no effect on stdout, stdin, or stderr.
Ist das, was ich gelesen habe. Haben Sie ein funktionierendes Beispiel?ungetc
funktioniert wie erwartet. Nicht ganz sicher über, wie zu verfolgen, lese - /Links pos. Aber wenn der buff ist neu-gefüttert, dann wäre es einfach.