0
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”。我想知道是什么问题。

如果信息不够,我正在编写一个网络通信程序。并且一旦客户端程序被杀死,该程序就不会卡住并打印出几个“ok after”。好像和网络有关,但是怎么fgets() 一个本地文件跟网络有关呢?我实际上是在尝试将此文件发送到远程客户端,但似乎该错误发生在发送之前。


经过聊天讨论,很明显问题根本不是fgets()网络代码。循环中的诊断消息没有换行符,因此诊断输出在生成时没有出现。


感谢 Jonathan Leffler,问题解决了。printf("确定后"); 信息没有出现,因为没有打印出换行符。因此,通过添加换行符: printf(ok after\n); 我们可以看到“ok after”被打印出来了。

4

2 回答 2

2

有两种可能性:

  • fgets() 中存在错误,并且从未进入 while 循环,因为它返回 NULL。

或者

  • fgets 正在等待 sizeof(buff) 字符、新行或 EOF:

fgets() 函数应从流中读取字节到 s 指向的数组中,直到读取 n-1 个字节,或者读取 <newline> 并将其传输到 s,或者遇到文件结束条件。然后字符串以空字节终止。

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

既然你说它被卡住了,它表示第二个选项。

干杯

于 2012-10-24T03:23:03.000 回答
0

fgets(我的 Mac OS 10.5 盒子上的那个)的手册页:

fgets() 和gets() 函数不区分文件结束和错误;调用者必须使用 feof(3) 和 ferror(3) 来确定发生了什么。

所以此时您还没有给我们(或您自己)足够的数据来诊断问题。


请注意,其中(3)只是指示您将查阅 unix 手册的哪一部分,与这些函数的参数无关。

于 2012-10-24T03:17:50.283 回答