2013-11-28 32 views
3

這個問題可能有點難以陳述。例如,一個節目從stdin收到一個字符串,但是它需要從用戶交互輸入,如:如何中斷另一個標準輸入流

echo "Some text to handle later after command is specified" | a.out 

而在節目的開頭:

printf("Please input command first"); 
scanf("%s", &cmd); 
/* Some Code Here */ 
/* process "Some text to handle later after command is specified" */ 

有沒有一種辦法「暫停」以前的輸入流並等待scanf的?

回答

1

除了從標準輸入讀取標準之外,標準並未指定任何方式來獲取交互式用戶輸入。由於你的stdin被一個管道佔用,你需要踩一個特定於實現的路徑。

對於類似Unix的系統,它將是一個名爲/dev/tty的特殊文件。 fopen它並使用正常的stdio功能。

在Windows上,您可能需要調用控制檯API。

Threre不保證程序附加到任何交互式設備上,因此準備失敗。

請注意,以這種方式編寫程序被認爲是不好的風格。如果有預期的用戶輸入,一個看好的程序應該只使用stdin。所有其他輸入流應通過命令行參數作爲文件名傳遞。

1

使用管道時,shell將程序stdin設置爲來自前一個命令的輸出。所以閱讀不應該是一個問題。

這裏的問題是,如果輸入來自管道(或重定向),則不應輸出任何輸出。這可以通過檢查isatty函數的結果來完成:

if (isatty(fileno(stdin))) 
{ 
    /* Only print prompt if input is an interactive terminal */ 
    printf(...); 
} 

scanf(...); 

還是我誤解你,你想讀從用戶,從管?那麼你可能不得不打開直接連接到終端。

爲此,您可以使用ttyname獲取stdout的TTY設備名稱,並打開該設備以輸入以讀取用戶輸入。如果stdout也通向管道(或正被重定向),那麼這將不起作用。

相關問題