2012-09-06 159 views
0

我有一個基本的C程序,需要從標準輸入讀取輸入。 首先,從輸入文件中使用C stdin無限讀取文件

./Program <input 

讀取信息,然後它遍歷來讀取,直到有沒有更多的

while(scanf("%s",command)!=EOF){ 
    printf("%s\n",command); 
} 

我需要從鍵盤看了一遍之後,但它無限地讓垃圾郵件從我的輸入文件中讀取最後一行,不讓我用我的鍵盤輸入。

while(1){ 

scanf("%s",command); 
if(!strcasecmp(command,"exit")) 
    exitProg(); 
else if(!strcasecmp(command,"help")) 
    helpMess(); 
else 
    printf("Command \"%s\" not recognized, use command \"help\" for a list.\n",command); 
} 
+0

如果將標準輸入重定向到文件,則不再連接到終端。 –

+0

有沒有辦法直接回到鍵盤? – kingdamian42

+4

在某些平臺上,是(沒有標準方法,但是)。然而,我也許只是把最初的文件作爲參數,然後用傳統的方法讀取它(而不是重定向任何東西)。 –

回答

0

閱讀documentation for scanf,特別是對返回值,摘錄如下部分:

返回值

成功時,該函數返回成功讀取的項目數。如果發生匹配故障,此計數可以匹配預期的讀數數量或更少,甚至爲零。 如果在成功讀取任何數據之前輸入失敗,則返回EOF。

您遇到的問題是一旦文件用完數據,程序的標準輸入不會恢復到控制終端,它將停留在空文件的末尾。您的scanf呼叫默默無效,因此不會修改command的內容。如果你想能夠從兩者中讀取,你需要找到另一種處理方式。

您的shell可能支持此功能。

+1

[不要使用cplusplus.com](http://jcatki.no-ip.org/fncpp/cplusplus.com) – 2012-09-06 19:15:29

+0

@ jons34yp:問題與您的鏈接,按類別:1.更正(網站的描述已更新)2.他們在主觀上相似3a。不好的做法並不意味着不正確的3b。僅引用了博客。 STL ==標準模板庫。這是一件真實的事情3c。除C++擴展外,網站還提供舊的C stdlib文件。那些與C++相關的使用等3d。不知道說些什麼4a。是的,它確實。讀取memcpy和memmove 4b的頁面。是的,閱讀atoi頁面4c。我懷疑這種行爲是特定於實現的。網站並未指定如何執行比較。 – Wug

+0

@ jons34yp:如果你不應該指向一個網站,因爲它不完美,那麼你可能不想引用SO。我認爲我會認爲cplusplus.com比沒有更有用。 –