我有一个关于fgets()的问题

char *fgets(char *str, int strsize, FILE *stream);

fgets()'文档显示:
成功时,函数返回相同的str参数如果遇到文件结尾且未读取任何字符,str的内容将保持不变,并返回空指针。
如果发生错误,则返回空指针。
您如何区分以上两种情况-fgets到达EOF(文件结尾)和读取文件时出错?
此外,当fgets读取文件时发生错误时,fgets是否会跟踪str中到该点为止读取的内容?
如何检查fgets是否立即到达EOF?

最佳答案

提到你的第一个问题:
您如何区分以上两种情况-fgets到达EOF(文件结尾)和读取文件时出错?
如果fgets()返回空值,则为刚才与ferror()调用一起使用的文件指针调用fgets(),后者返回NULL如果ferror()返回非零值,则fgets()失败,否则它已到达文件末尾。
例子:

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

#define LINE_LEN_MAX (42)

int main(int argc, char ** argv)
{
   if (1 >= argc)
   {
     errno = EINVAL;
     perror("main() failed");
     exit(EXIT_FAILURE);
   }

   {
     FILE * fp = fopen(argv[1], "r");
     if (NULL == fp)
     {
       perror("fopen() failed");
       exit(EXIT_FAILURE);
     }

     for (char line[LINE_LEN_MAX];
       NULL != fgets(line, LINE_LEN_MAX, fp);)
     {
       printf("%s", line);
     }

     if (0 != ferror(fp))
     {
       perror("fgets() failed");
       exit(EXIT_FAILURE);
     }

     fclose(fp);
   }

   return EXIT_SUCCESS;
 }

另一个问题可以从the docs直接回答:
问题3:
如何检查fgets是否立即到达EOF?
回答:
如果遇到文件结尾,并且数组中未读取任何字符,则数组的内容保持不变,并返回空指针
问题2:
当fgets读取文件时发生错误时,fgets是否跟踪str中到该点为止读取的内容?
回答:
如果在操作期间发生读取错误,则数组内容不确定,并返回空指针。

关于c - 如何区分到达EOF和到达错误的fget,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58461952/

10-13 23:12