2017-01-22 53 views
0

我面對一段代碼,我不明白:如何控制fileno的輸出?

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

我知道fileno返回與sdtin這裏,然後readi變量把這個值相關聯的文件描述符。

那麼,stdin允許i與第一個「case」匹配的值應該是多少,即\n

謝謝

+0

你知道'read'的功能是什麼?將所示代碼中的'read'調用看作是從'stdin'中執行無緩衝的'getchar'或'getc'或'fgetc'的簡單方法。那麼你的問題是否有意義? 'getchar'而不是'read'? –

+0

對不起,我剛剛更新了我的文章 – HolyGraal

+1

'i'的類型必須是'char'(或'signed char'或'unsigned char'),輸入中未讀的下一個字節必須是換行符。 –

回答

0

我知道fileno返回這裏的sdtin關聯的文件描述符,

是的,儘管我懷疑你不知道那是什麼意思。

然後read把這個值放在i變量中。

號無無無無無。 read()把文件描述符的值,或任何部分,在提供的緩衝區(在你的情況下,i字節)。正如它的名字所暗示的,read()嘗試閱讀作爲第一個參數傳遞的文件描述符表示的文件。讀取的字節(如果有)存儲在提供的緩衝區中。

stdin代表程序的標準輸入。如果您從交互式shell運行該程序,那將對應於您的鍵盤。該程序嘗試讀取用戶輸入,並將其與換行符進行比較。

該程序可能存在缺陷,也可能是完全錯誤的,儘管從所提供的片段中無法分辨出來。如果i是類型爲int的變量,那麼它的表示形式大於一個字節,但您只讀取一個字節。這將只替換表示的一個字節,結果取決於C實現和數據讀取。

什麼程序似乎是試圖做可以由具有read()工作,但我會建議使用getchar()代替:

#include <stdio.h> 

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

i = getchar(); 

/* ... */ 
2

但應該是什麼標準輸入的值,以配合第一「的情況下」,即\ n嗎?

case語句不會查看stdin的「值」。

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

讀取單個字節到i(假設read()調用成功),如果該字節是\n(換行符),那麼它會匹配的情況。您可能需要閱讀read(2)的手冊頁以瞭解其功能。

+0

對不起,我只是更新了我的帖子 – HolyGraal

+1

'stdin'是一個文件指針; 'fileno'調用提供它的文件描述符值'0'(在''中定義的宏'STDIN_FILENO'表示相同)。因此,讀取調用相當於:'read(0,&i, 1);',它讀取一個字節,不知道stdin是如何直接連接到case語句的,它本質上是從標準輸入中讀取一個字節並檢查它是否爲\ n '(換行符) – usr

+0

這段代碼是有效的,所以必須有int(「\ n」)必須是文件描述符的值的情況 – HolyGraal