2017-01-22 15 views
0

私は理解していないコードの一部に直面している:filenoの出力を制御する方法は?

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

私はその後、readi変数にこの値を入れ、ここにsdtinに関連付けられたファイルディスクリプタを返すfilenoことを知っています。

iを最初の「ケース」と一致させるには、どのような値をstdinにする必要がありますか。つまり、\n

はありがとう

+0

あなたは 'read'機能が何を知っていますか?表示されたコードの 'read'呼び出しを' stdin'から 'getchar'や' getc'や 'fgetc'を実行する簡単な方法と考えてください。あなたの質問はそれが意味を成しているかどうか、もしあれば'read'の代わりに使われた' getchar'ですか? –

+0

申し訳ありません私の投稿を更新しました – HolyGraal

+1

'i'の型は' char'(または 'signed char'または' unsigned char')でなければなりません。そして、入力中の未読の次のバイトは改行でなければなりません。 –

答えて

0

私は私はあなたがそれが何を意味するのか分からない疑いがあるものの、はい

、ここsdtinに関連付けられたファイルディスクリプタを返すfilenoことを知っています。

次にreadこの値を変数iに設定します。

なしなしなしなしなし号。 read()ファイルディスクリプタの値またはその一部を指定されたバッファに入れます(この場合は、バイトはi)。その名前が示唆するように、read()は、への試み、のファイルの最初の引数として渡されます。読み込まれたバイトは、もしあれば、提供されたバッファに格納されます。

stdinは、プログラムの標準入力を表します。インタラクティブシェルからプログラムを実行すると、キーボードに対応します。プログラムはユーザーの入力を読み込み、改行と比較しようとします。

プログラムに欠陥がある可能性がありますが、間違っている可能性がありますが、提示された断片だけでは分かりません。 iがタイプintの変数である場合、その表現は1バイトよりも大きいですが、1バイトだけを読み込んでいます。これは表現の1バイトのみを置き換え、結果はCの実装とデータの読み込みに依存します。どのようなプログラムがやろうとしているように見えるが

read()で動作させることができますが、私の代わりにgetchar()を使用することをお勧めします:

#include <stdio.h> 

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

i = getchar(); 

/* ... */ 
2

しかし、何が標準入力の値が最初の「ケース」、すなわち\ n個と一致しなければなりませんか?

case文では、stdinの "value"を参照しません。

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

iにシングルバイトを読み込み(read()コールを仮定することに成功している)、そのバイトは\n(改行文字)であれば、それはケースと一致します。それが何であるかを理解するには、おそらくread(2)のマニュアルページを読む必要があります。

+0

申し訳ありませんが、私の投稿を更新しました – HolyGraal

+1

'stdin'はファイルポインタです。 'fileno'呼び出しは、そのファイルディスクリプタ値を '0'(マクロ' STDIN_FILENO'、 ''で定義されています)とします。 'read(0、&i, 1);')は、1バイトを読み込みます。 'stdin'がcase文に直接どのように接続されているのかわかりません。基本的に標準入力から1バイトを読み込み、' n '(改行)。 – usr

+0

このコードは有効なので、int(" \ n ")はファイル記述子の値でなければなりません。 – HolyGraal

関連する問題