[英]fgets not blocking for input - C
我正在為學校編寫程序; 這是我第一次與C合作。
我正在使用fgets讀取輸入,但有時fgets不會阻塞(將程序陷入無限循環)。 要回答每個人的第一個問題,不,我沒有在剩下多余的\\n
之前使用scanf,這會導致此問題。 我曾經使用sscanf,但這與fgets關聯,因此我認為這不是問題。
已經提供了一些處理套接字的代碼。 我已經瀏覽了一下,但是找不到問題的根源。 由於長度原因,未包含該代碼,但如果有幫助,我可以將其包含在內。
長話短說,除了scanf問題外,fgets是否有任何理由不會阻止輸入? 任何幫助表示贊賞!
編輯:我應該早些時候弄清楚這一點,但是在這種情況下,我僅將fgets用於stdin。
與C語言中的大多數標准函數一樣,您需要做一些挖掘來弄清楚正在發生的事情。 最好的起點是功能文檔。
從該文檔中,我們可以看到fgets接受三個參數並返回一個char *。 假設參數正確,函數將從流中讀取數據,直到到達換行符或文件標記的末尾。 如果成功,則返回代碼將是指向str參數的指針。
但是,您可能更感興趣的情況是失敗情況。 失敗時,該函數返回NULL。 要確定故障發生的確切程度,您需要檢查文件錯誤指示符,並查看其是否已打印消息。 可以按照以下步驟進行:
if ( fgets (mystring , 100 , pFile) == NULL )
{
// We handle error here
if (ferror (pFile))
{
printf ("We encountered an error!\n");
perror ("Error message");
}
}
從這里,您應該能夠確定正在發生的事情。 可能的原因是參數無效或參數不是預期的格式/條件。
我知道這是一個比較老的問題,但是我想我會分享我遇到這個問題時發現的內容。 沒有您的代碼,我無法確定這是否與您遇到的問題相同,但是在我自己的代碼中發現的是,我對設置為0的文件描述符使用close()
。很好奇,我查找了什么文件描述符0在系統中,並且標准輸入為FD 0( http://en.wikipedia.org/wiki/File_descriptor )。 我敢肯定有很多方法可以解決這個問題,但是在我的案例中,我使用了一個簡單的if語句圍繞我的close:
if(fd > 2)
{
close(fd);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.