Was ist „Standardeingabe“?

Lesezeit: 4 Minuten

Benutzeravatar von Kio Marv
Kio Marv

Ich wurde beauftragt, ein Testprogramm zu erstellen C das liest den Inhalt der Standardeingabe und druckt sie dann aus.

Aber ich habe einen kleinen Zweifel: was genau ist Standardeingabe?

Ist es das, was ich auf der Tastatur eingebe? Ist es eine Datei, die ich lesen muss?

Beide?

Und dasselbe gilt für standard output: ist es die Konsole? eine Datei?

  • 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. 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

Benutzeravatar von Basile Starynkevitch
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

Benutzeravatar von Technosaurier
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.

1432490cookie-checkWas ist „Standardeingabe“?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy