stdin und stdout
-
Hallo,
momentan beschäftige ich mich mit dem Thema Systemprogrammierung unter Linux mittels C.
Ganz am Anfang des Buches bin ich auf ein ominöses Beispiel gestossen.
#include "eighdr.h" int main(void) { int zeich; while ( (zeich = getc(stdin)) != EOF) if(putc(zeich, stdout) == EOF) exit(0); }
Ich möchte dazu etwas sage: die eighdr.h ruft Makros auf und definiert wichtige Konstanten und bindet zusätzlich wichtige .h Dateien ein.
Mir geht es aber viel mehr um die while Schleife und um die If-Abfrage.
Klar - die While-Schleife liest solange Zeichen für Zeichen von der Tastatur, bis EOF kommt (ENTER) und schreibt es gleich in die STDIN.Sobald man dann Enter drückt kommt die If-Abfrage, die jedes Zeichen aus der STDOUT liest und ausgibt bis EOF erreicht ist.
Was is aber nicht verstehe ist, dass folgender Code nicht funktioniert:
#include "eighdr.h" int main(void) { int zeich; while ( (zeich = getc(stdin)) != EOF) if(zeich == EOF) { putc(zeich, stdout); } exit(0); }
Den Code habe ich selber gebastelt. Aber er geht nicht. Gut das sollte auch nicht das Problem sein. Ich habe nur noch nie in meinem Leben eine so komische if-Abfrage gesehen.
Es heisst ja immer:
If(Bedingung)
{
Anweisung
}Klar - die Klammern ({}) kann man auch weglassen wenn nach der Ifabfrage nur eine weitere Zeile folgt. Das selbe gilt für die While Schleife.
Aber die If-Abfrage macht doch nix. Die überprüft nur.
Oder werden mittels putc(zeich, stdout) die Zeichen gleich aus der STDT gelesen ohne das ich noch was machen muss? anscheinend.
Also ihr mehr mit dem ersten Beispiel habe ich so meine Verständnisprobleme. Es wäre nett wenn ihr mir das vielleciht mit euren eigenen Worten erklären könnt :=)
Danke
-
dein Code funktioniert nicht, weil du nur ein Zeichen ausgibst, wenn zeich EOF ist, was du aber vorher schon ausschließt durch die while Bedingung. Der eigentliche Code arbeitet genau anders.
durch besseres einrücken ist das leicht zu erkennen
while( (zeich=getc(stdin)) != EOF) if(putc(zeich,stdout)==EOF) exit(0);
-
Folgendes:
if(putc(zeich, stdout) == EOF)
Ist das gleiche wie
if((putc(zeich, stdout) == EOF)!=0)
Ist nur ne verkürzte Schreibweise. Damit wird überpürft, ob in zeich ein EOF vorkommt. Wenn ja, wird 1 zurückgeliefert, wenn nicht, 0.
Wenn also 1 zurückgeliefert wird bedeutet dies, das ein EOF vorgekommen ist, und putch(zeich, stdout) wird NICHT mehr ausgeführt.
Dein Programm wäre dann die längere Version. Funktionieren würde es so:
#include "eighdr.h" int main(void) { int zeich; while ( (zeich = getc(stdin)) != EOF) if(zeich != EOF) { putc(zeich, stdout); } exit(0); }
Also nur wenn KEIN EOF vorkommt wird der nachfolgende Code ausgeführt.
Kannst auch mal den Rückgabewert test:printf("%i\n", (putc(zeich, stdin)== EOF) )
Dürfte eigentlich nur 0 oder 1 rauskommen.
-
dumme frage was macht putc???
-
CarstenJ schrieb:
if(putc(zeich, stdout) == EOF)
Ist das gleiche wie
if((putc(zeich, stdout) == EOF)!=0)
Ist nur ne verkürzte Schreibweise. Damit wird überpürft, ob in zeich ein EOF vorkommt. Wenn ja, wird 1 zurückgeliefert, wenn nicht, 0.
Äh, ja. Und das ist wiederum nur eine verkürzte Schreibweise für
if(((((putc(zeich, stdout) == EOF)!=0)==1)!=0)==1)
-
@eiskalt:
putc gibt ein Zeichen auf die Standardausgabe (stdout) aus. In dem Fall das gleiche wie putchar.