2012-10-05 38 views
4

我認爲這很簡單,但對我來說顯然不是!如何從鍵盤讀取stdin被設置爲C文件時

我有一個控制檯應用程序。我需要從鍵盤讀取輸入,但stdin已被重定向到一個文件。那麼如何創建一個FILE-Handle指向鍵盤流,我可以使用fgets等?

我發現ttyname(0)似乎是我在POSIX環境中尋找的東西,我沒有在這裏找到。我使用的是標準Visual Studio編譯器的Windows系統。

任何想法?先謝謝你。

+0

'ttyname'函數在POSIX環境中沒有幫助,因爲當輸入來自管道或重定向文件時它會返回NULL。 –

+0

'stdin已被重定向到一個文件。「 - 爲什麼不把'fileclip'指向一個新文件?一旦完成後,再次將stdin重定向到舊文件。 –

+0

從某種意義上說,這就是我想要做的nav_jan,但是如果我不知道控制檯的路徑,我無法用'fopen'或'freopen'打開它。如果我有這個路徑,我不需要重定向'stdin'。我可以創建另一個鍵盤輸入句柄,並獨立使用文件和鍵盤輸入。但謝謝你的想法。 –

回答

1

有沒有簡單/便攜的方式來判斷鍵盤是否存在(您的應用程序可能正在從終端仿真程序中通過串口,遠程登錄會話或其他任何方式運行)。如果鍵盤確實存在(包括觸摸屏上的鍵盤圖片),那麼您無法確切知道擊鍵在進入應用程序之前需要經過多少層軟件(例如擊鍵可能會從鍵盤驅動程序到輸入法編輯器到GUI到您的應用程序的外殼)。這意味着嘗試從鍵盤驅動程序直接獲取鍵擊是一個壞主意,幾乎在所有情況下都會失敗。

解決您的問題的最佳方法是找出導致STDIN首先被重定向的哪一系列設計失敗。

例如;也許應用程序應該有一個命令行選項來讀取文件中的一些數據;這樣應用程序就可以從文件中獲取一些數據,並從STDIN中獲取一些數據(並且如果命令行選項不存在,則從STDIN獲取所有數據)。

1

從DOS編程的黑暗日子裏拉出來:嘗試打開「CON:」(控制檯),一個保留字。希望它能在Windows中以相同的方式打開。冒號可能需要也可能不需要。 「dir> con:」和「dir> con」仍然在命令提示符下工作。

此外,請務必使用輸出句柄上的setbuf()系列中的某些內容來避免緩衝......它不應該緩衝終端I/O,但它絕對不會受傷。

再次,不確定,但我懷疑打開單獨的FILE *conin, *conout輸出和一個輸入可能會幫助,如果你似乎有一個處理輸入和輸出的手柄麻煩。