@devnull Danke für den Link. Aber, Unless redirected, input is expected from the keyboard which started the program. Dass redirected… es bedeutet, dass die Eingabe aus einer Datei erfolgen kann?
– Kio Marv
23. Oktober 2013 um 11:34 Uhr
In C Standardeingabe ist stdin und Standardausgabe ist stdoutbeide definiert in <stdio.h>; die Tatsache, dass sie “Tastatur” oder “Datei” sind, ist irrelevant …
– Basile Starynkevitch
23. Oktober 2013 um 11:37 Uhr
@BasileStarynkevitch, aber sollten sie nicht anders behandelt werden? Wenn die Eingabe aus einer Datei stammt, sollte diese nicht zuerst geöffnet werden?
– Kio Marv
23. Oktober 2013 um 11:57 Uhr
mögliches Duplikat von verwirrt über stdin, stdout und stderr?
– Jo
23. Oktober 2013 um 18:39 Uhr
Basile Starynkevitch
Der C-Standard (z. B. C99 oder C11) definiert, was von dem Standard zu erwarten ist <stdio.h> Header (nachdem passend #include-d es). Sehen Studio(3) Manpage. Dann hast du die stdin und stdout und stderr Dateihandles (Zeiger auf einige FILE das ist ein abstrakter Datentyp).
Die Tatsache, dass stdin mit irgendeinem Gerät (z. B. einer Tastatur) zusammenhängt Implementierung spezifisch.
Sie könnten (aber das wäre unethisch und/oder ineffizient) den C-Standard mit zB einem Raum menschlicher Sklaven implementieren (das ist unethisch, wenn Sie bezahlte Arbeiter einsetzen, die einfach ineffizient wären), anstatt einen Computer zu verwenden. Oft geben Computer Ihnen eine Implementierung des C-Standards durch die Hilfe von einigen Betriebssystem.
Vielleicht möchten Sie in Ihrem C-Programm wissen, ob stdin ist eine “Tastatur” oder wird von einer “Datei” umgeleitet. Leider, AFAIK, gibt es keine C99-Standardmethode, um das zu wissen.
Wie Sie erwähnen, stdin, stdout und stderr sollte beim Start in Ihrem Programm verfügbar sein (d.h. nach der Eingabe von main ….). Daher, es sei denn, Sie fclose das stdin Stream, können Sie es lesen (mit getchar, scanf, getline, fgets, fscanf … und Freunde) ohne vorherige Betreuung (also müssen Sie nicht fopen es selbst).
Unter Linux oder den meisten Posix-Systemen können Sie als Annäherungswert verwenden isatty(STDIN_FILENO) – sehen satt(3) für mehr – um zu testen, ob stdin “ist” die “Tastatur” (durch Testen, ob es sich um ein tty handelt). Siehe auch dies und das.
At program startup, three text streams are predefined and need not be opened explicitly OK. Also ob es eine Datei oder eine Tastatureingabe ist, ich kann das lesen stdin sofort, ohne zu prüfen, ob es geöffnet ist, oder?
– Kio Marv
23. Oktober 2013 um 12:00 Uhr
Ja, Standardeingabe (stdin) wird von der Tastatur erwartet. Könnte also in Form einer Benutzereingabe von einem Basisprogramm oder von einem Befehlszeilenargument vorliegen. Die Standardausgabe (stdout) ist die Ausgabe des Codes, normalerweise im Terminalfenster. Sie könnten Ihren Code fast überall ausgeben, dh in eine Datei, in ein Textfeld, einen Browser, aber der Standard ist die Standardausgabe, die das Terminal ist.
Ich hoffe, das hilft.
Normalerweise ist die Standardeingabe die Tastatur und die Standardausgabe der Bildschirm. Sie können dies jedoch in der Befehlszeile mit den Symbolen „<“ und „>“ umleiten. Eine Kommandozeile wie
dir /s > "Tree.txt"
ändert die Standardausgabe für den Befehl dir in die angegebene Datei. Die gesamte Ausgabe geht also in diese Datei. Die aufgerufene Anwendung oder der aufgerufene Befehl selbst bemerkt normalerweise nicht einmal den Unterschied.
Ihr Beispiel ist Windows-spezifisch. Auf Posix- oder Linux-Systemen wäre es so ls -R > Tree.txt
– Basile Starynkevitch
23. Oktober 2013 um 11:35 Uhr
Richtig, aber die Syntax ist ansonsten identisch (zumindest für einfache Fälle)
– PMF
23. Oktober 2013 um 11:36 Uhr
Aha. Und bei dieser Umleitung bedeutet dies, dass die Ausgabezeichenfolge von dir wird in die Datei geschrieben?
– Kio Marv
23. Oktober 2013 um 11:39 Uhr
Ja genau. Versuch es.
– PMF
23. Oktober 2013 um 13:12 Uhr
Technosaurier
stdin ist Dateideskriptor 0, Sie können eine Datei in stdin erhalten, indem Sie:
cat file |yourprog
#or
yourprog <file
ebenso für stdout (Dateideskriptor 1)
yourprog | someotherprog #pipe your stdout to the stdin of another program
yourprog > somefile #save stdout to a file
yourprog >> somefile #append stdout to a file
und stderr (fd 2)
yourprog 2> errlogfile
Wenn Sie ein Programm haben, das eine Datei akzeptiert, aber stdin nicht verarbeitet, können Sie die obigen Formate verwenden, indem Sie dies tun (unter der Annahme -f, wenn das Argument der Eingabedatei) myprog -f /dev/stdin
//and a horrible example of how not to read from stdin and write to stdout
char buf[4096];
while(write(1,buf,read(0,buf,4096)));
Standardausgabe (oder stdout) bezieht sich auf die standardisierten Datenströme, die von Befehlszeilenprogrammen (dh reinen Textmodusprogrammen) in Linux und anderen Unix-ähnlichen Betriebssystemen erzeugt werden.
Dies könnte helfen.
– devnull
23. Oktober 2013 um 11:32 Uhr
@devnull Danke für den Link. Aber,
Unless redirected, input is expected from the keyboard which started the program
. Dassredirected
… es bedeutet, dass die Eingabe aus einer Datei erfolgen kann?– Kio Marv
23. Oktober 2013 um 11:34 Uhr
In C Standardeingabe ist
stdin
und Standardausgabe iststdout
beide definiert in<stdio.h>
; die Tatsache, dass sie “Tastatur” oder “Datei” sind, ist irrelevant …– Basile Starynkevitch
23. Oktober 2013 um 11:37 Uhr
@BasileStarynkevitch, aber sollten sie nicht anders behandelt werden? Wenn die Eingabe aus einer Datei stammt, sollte diese nicht zuerst geöffnet werden?
– Kio Marv
23. Oktober 2013 um 11:57 Uhr
mögliches Duplikat von verwirrt über stdin, stdout und stderr?
– Jo
23. Oktober 2013 um 18:39 Uhr