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 脚本。任何帮助将不胜感激。

4

2 回答 2

14

这两个函数都可以在 C++ 网站上找到详细记录( 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).
}
于 2013-08-15T13:21:21.693 回答
4

fgets遇到时停止阅读\n,而fread阅读。

于 2013-08-15T13:17:57.583 回答