2017-01-22 5 views
0

Ich bin ein Stück Code gegenüber, die ich nicht verstehe:Wie steuert man die Ausgabe von fileno?

read(fileno(stdin),&i,1); 
switch(i) 
{ 
    case '\n': 
     printf("\a"); 
     break; 
    .... 

Ich weiß, dass fileno den Dateideskriptor mit dem hier sdtin zugeordnet zurück, dann read diesen Wert in i Variable setzen.

Also, was sollte der Wert von stdin sein, um i mit dem ersten "case" übereinstimmen, d. H. \n?

Danke

+0

Wissen Sie, was die 'read' Funktion tut? Stellen Sie sich den Aufruf "read" im gezeigten Code vor, um einen ungepufferten 'getchar' oder' getc' oder 'fgetc' aus' stdin' zu erstellen. Wäre Ihre Frage dann sinnvoll, wenn es z. 'getchar' das wurde anstelle von' read' verwendet? –

+0

Tut mir leid, ich habe gerade meinen Beitrag aktualisiert – HolyGraal

+1

Der Typ von 'i' muss' char' (oder 'signed char' oder' unsigned char') sein, und das nächste ungelesene Byte in der Eingabe muss ein Newline sein. –

Antwort

0

Ich weiß, dass fileno den Dateideskriptor mit dem hier sdtin zugeordnet zurückzukehren,

Ja, obwohl ich Sie vermuten, wissen nicht, was das bedeutet.

dann read setzen Sie diesen Wert in i Variable.

Nein Nein Nein Nein Nein Nein. read()nicht setzen Sie den Wert des Dateideskriptors oder einen Teil davon in den bereitgestellten Puffer (in Ihrem Fall die Bytes von i). Wie der Name vermuten lässt, versucht read()von die Datei durch den Dateideskriptor als sein erstes Argument übergeben zu lesen. Die gelesenen Bytes werden, falls vorhanden, in dem bereitgestellten Puffer gespeichert.

stdin steht für die Standardeingabe des Programms. Wenn Sie das Programm über eine interaktive Shell ausführen, entspricht dies Ihrer Tastatur. Das Programm versucht, Benutzereingaben zu lesen und sie mit einem Zeilenumbruch zu vergleichen.

Das Programm ist wahrscheinlich fehlerhaft und vielleicht völlig falsch, obwohl es unmöglich ist, nur aus dem Fragment zu erkennen. Wenn i eine Variable vom Typ int ist, dann ist ihre Darstellung größer als ein Byte, aber Sie lesen nur ein Byte hinein. Dadurch wird nur ein Byte der Darstellung ersetzt, wobei die Ergebnisse von der C-Implementierung und den gelesenen Daten abhängen.

Was scheint das Programm zu versuchen, gemacht zu tun ist mit read() zu arbeiten, aber ich würde empfehlen, getchar() statt mit:

#include <stdio.h> 

/* 
... 
int i; 
... 
*/ 

i = getchar(); 

/* ... */ 
2

Aber was der Wert von stdin sein sollte mit dem ersten „Fall“, das heißt \ n übereinstimmen?

Die case-Anweisung betrachtet nicht den "Wert" von stdin.

read(fileno(stdin),&i,1); 

liest in einem einzigen Byte in i (unter der Annahme read() Aufruf erfolgreich ist) und wenn das Byte \n (Newline-Zeichen) ist, dann wird es den Fall übereinstimmen. Sie müssen wahrscheinlich die Manpage von read(2) lesen, um zu verstehen, was es tut.

+0

Tut mir leid, ich habe gerade meinen Beitrag aktualisiert – HolyGraal

+1

'stdin' ist ein Dateizeiger; Der 'fileno'-Aufruf liefert seinen Datei-Deskriptorwert, der '0' ist (das Makro 'STDIN_FILENO', definiert in' ', repräsentiert dasselbe). Also, Leseaufruf ist äquivalent zu: 'read (0, &i, 1);' liest ein einzelnes Byte. Nicht sicher, wie 'stdin' direkt mit der case-Anweisung verbunden ist. Es liest im Wesentlichen ein Byte von der Standardeingabe und überprüft, ob es' \ n ist '(newline) – usr

+0

Dieser Code ist gültig, also muss es einen Fall geben, in dem int (" \ n ") der Wert eines Dateideskriptors sein muss – HolyGraal

Verwandte Themen