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 after”。我想知道是什么问题。
如果信息不足,我正在编写网络通信程序。一旦客户端程序被杀死,这个程序就可以免于卡住并打印出几个“ok after”。它似乎与网络有关,但fgets()如何与网络相关的本地文件?我实际上是在尝试将此文件发送到远程客户端,但似乎在发送之前发生了错误。
在聊天讨论后,很明显问题根本不是fgets()
,而是网络代码。循环中的诊断消息没有换行符,因此生成时诊断输出不会出现。
感谢Jonathan Leffler,问题解决了。 printf(“ok after”);信息没有出现,因为没有打印出换行符。所以通过添加换行符:printf(在\ n之后确定);我们可以看到打印出“ok after”。
答案 0 :(得分:2)
有两种可能性:
或
fgets()函数应从流中读取字节到数组中 s指向,直到读取n-1个字节,或者< newline>阅读和 转移到s,或遇到文件结束条件。该 然后使用空字节终止字符串。
http://pubs.opengroup.org/onlinepubs/007904875/functions/fgets.html
因为你说它被卡住了,它表示第二个选项。
欢呼声
答案 1 :(得分:0)
从fgets
的手册页(Mac OS 10.5框中的那个):
fgets()和gets()函数不区分文件结尾和 错误;呼叫者必须使用feof(3)和ferror(3)来确定哪个 发生。
所以此时你没有给我们(或你自己)足够的数据来诊断问题。
请注意,(3)
中只显示了您将参考的unix手册的哪一部分,并且与这些函数的参数无关。