2012-10-24 141 views
1
printf("ok before fgets\n"); 
while ((fgets(buff, sizeof(buff), fi)) != NULL) 
{ 
    printf("ok after"); 
    if(write(connfd,buff,strlen(buff)) != strlen(buff)) 
    { 
     printf("write() failed\n"); 
     close(connfd); 
     exit(1); 
    } 
} 

這是代碼。代碼在fgets之前打印「ok」,但它從不打印「ok after」。我不知道有什麼問題。fgets()在什麼情況下卡住了?

如果信息不夠,我正在寫網絡通信程序。一旦客戶端程序被終止,這個程序就不會被卡住並打印出幾個「ok after」。它似乎與網絡有關,但fgets()與網絡相關的本地文件又如何?我實際上是試圖發送這個文件到遠程客戶端,但似乎在發送之前發生了這個錯誤。


聊天討論後,人們清楚地看到,問題並不fgets()可言,但網絡代碼。循環中的診斷消息沒有換行符,因此生成時診斷輸出未顯示。


由於Jonathan Leffler,問題就解決了。 printf(「ok after」);信息沒有出現,因爲沒有打印出新行。所以通過添加一個換行符:printf(在\ n之後確定);我們可以看到「ok after」打印出來。

+1

您是否已成功打開'fi'? 「buff」有多大? – dmckee

+0

@dmckee,如何檢查我是否成功打開它?但它不是NULL。 buff足夠大以容納整個文件。 – yoyosir

+0

在循環的主體之後是否有'printf()'調用?這可能是文件是空的嗎?是否有機會打開某種特殊文件,如FIFO?如果是這樣,你打開它來閱讀和寫作 - 這將永久掛起fgets()。 –

回答

0

從手冊頁fgets(一個在我的Mac OS 10.5箱):

將與fgets(),並得到()函數沒有錯誤檔案結尾和 區分;來電者必須使用feof(3)和ferror(3)來確定發生了哪個 。

所以在這一點上,你還沒有給我們(或你自己)足夠的數據來診斷問題。


注意,在那裏(3)僅僅是Unix手冊中,你會諮詢的哪個部分的指示,並具有無關參數這些功能。

2

有以下兩種方式:

  • 有在與fgets()的錯誤和while循環從未進入,因爲它會返回NULL。

  • 與fgets正在等待的sizeof(BUFF)字符,一個新行或EOF:

的與fgets()函數將讀取流的字節到陣列由s指向的 ,直到讀取n-1個字節,或者<換行符>被讀取並且 被傳送到s,或者遇到文件結束條件。然後 字符串以空字節結束。

http://pubs.opengroup.org/onlinepubs/007904875/functions/fgets.html

既然你說,這是卡住,它表示第二個選項。

歡呼聲

+0

雖然OP表示緩衝區足夠大,可以讀取整個文件,但是現在我感到困惑。 – dmckee

+0

@dmckee我已經添加了一些信息。 fi是一個本地文件。既然它不是空的,我想我已經打開它了。 – yoyosir

相關問題