fgets和fread之间的区别

5
我有以下代码:

下面是代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    int lendata;
    printf("Content-type:text/html\n\n");
    printf("<html><body>");

    lendata = atoi(getenv("CONTENT_LENGTH"));
    char *buf = malloc(lendata+1);
    fread(buf,lendata,1,stdin);

    printf("%s\n<br>",buf); 
    printf("%d",lendata);   

    free(buf);

    printf("</body></html>");
    return 0;
}

当我使用fgets时,它会截断显示的数据。但是当我使用fread时,它会显示所有内容。顺便说一下,这是使用POST方法上传HTML文件的CGI脚本。非常感谢您的帮助。

2个回答

14

这两个函数都有详细的文档说明(freadfgets)。如果想要深入了解它们之间的技术差异,请参考文档。

简而言之,fgets会读取直到第一个换行符、最大读取字节数或者EOF,以先到者为准。而fread会读取一定数量的单词(我将单词定义为一组字节,如4个字节一组),并在达到指定限制或读取0字节时停止(通常意味着EOF或错误)。

如果您想要使用其中任何一个函数读取直到EOF,则可以按以下方式进行:

char buffer[ buff_len ];

// ... zero-fill buffer here.

while ( fgets( buffer, buff_len, stdin ) != EOF ) {
  // ... do something with buffer (will be NULL terminated).
}

while ( fread( buffer, sizeof( buffer[ 0 ] ), sizeof( buffer ) / sizeof( buffer[ 0 ] ), stdin ) != 0 ) {
  // ... do something with buffer (not necessarily NULL terminated).
}

你想要 char buffer[ buff_len ]; 替代吗?(没有 *)。顺便说一下:在 fread( ( void * )buffer 中,( void * ) 是多余的。 - chux - Reinstate Monica
@chux,那是一个打字错误,而且我不确定void转换,所以我还是加上了,因为我知道无论如何都不会有害。但你说得很对。 - Jacob Pollack
1
我建议使用fread(buffer, sizeof(buffer[0]), sizeof(buffer)/sizeof(buffer[0]), stdin)这种方式,因为它可以很好地适应重新编辑的foo_type buffer[foo_N] - chux - Reinstate Monica

4

fgets在遇到\n时停止读取,而fread则会一直读取。


1
那么我可以使用fgets来读取由换行符分隔的多行文本吗? - user2672367
1
您可以使用fgets在循环中,直到达到EOF - Sakthi Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接