为什么fgets()返回一个指向新填充的char数组的指针?

时间:2014-08-18 11:23:14

标签: c pointers fgets

我可以通过以下方式使用fgets:

FILE *fp = fopen("text.txt", "r");
if(fp == NULL)
  return 1;

char line[50];
fgets(line, 50, fp);

// do more stuff

这会根据文件中的字符填充line,因此为什么会fgets() 需要返回指向line的指针? line现在包含我需要的数据,那么返回指向它的指针有什么用呢?

4 个答案:

答案 0 :(得分:3)

因为fgets(3)POSIX fgets中都记录了这一点。

此外,如果您确定它确实返回了非NULL指针(即它没有失败),您可以将其结果用作其他函数的参数。我认为不测试它是错误的。

顺便说一句,我通常建议使用较新的POSIX getline,它能够处理任意长的行(只要资源允许) - 并且成功返回行长。

答案 1 :(得分:1)

因为它必须返回一些东西来指示错误。在创建时,返回指针从gets平滑过渡。它是程序员编写的程序员友好的: - )

答案 2 :(得分:0)

它在EOF或错误上返回NULL,因此它为您提供了一种检测呼叫成功或失败的简便方法:

if ( fgets( line, sizeof line, fp ))
{
  // do something with line
}
else
{
   // read failed
}

为什么指针与整数值相对?正如其他人所提到的,gets返回了一个指针值,因此这使得替换任何现有的gets调用变得容易(尽管换行语义不同,所以它不是一个完全无痛的变化)。 / p>

为什么gets会返回一个指针?这对丹尼斯·里奇来说是一个问题;不幸的是,他不再能够回答。

答案 3 :(得分:0)

使用fgets()返回值来区分预期结果与其他结果。

char *fgets(char * restrict s, int n, FILE * restrict stream);会返回sNULL。 发生文件结束条件(EOF)或发生I / O错误时,将返回NULL

if (fgets(line, sizeof line, fp)) {  // best to use sizeof buffer @John Bode
  // do more stuff
}
else {
  // Handle EOF/IO errors.
  // In typical practise, only 1 of these 2 conditions are true.
  if (ferror(fp)) Handle_IOError();
  if (feof(fp)) Handle_EOF();
}