首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C stdio fgets()

C stdio fgets()
EN

Stack Overflow用户
提问于 2017-01-27 06:34:54
回答 1查看 87关注 0票数 0

在课堂上,我遇到了以下代码片段

代码语言:javascript
复制
for (numlines = 0, (fp=fopen("thefile",'r')); feof(fp); numlines++ ) { 
    fgets(fp, buffer, sizeof(buffer), fp);
    ...
}

在for-loop头中,可以初始化两件事,即numlinesfp,对吗?

然后在for循环的主体中,

代码语言:javascript
复制
fgets(fp, buffer, sizeof(buffer), fp);

这就是让我困惑的地方..我以为fgets()函数会接受这些参数

代码语言:javascript
复制
char *fgets(char *str, int n, FILE *stream)

你知道这两个fps在做什么吗?

EN

回答 1

Stack Overflow用户

发布于 2017-01-27 07:14:21

知道这两个fps在做什么吗?

这是一个打字错误--作者在写那句话的时候显然弄错了。编译器应该会抱怨这个调用。

它还应该抱怨fp=fopen("thefile",'r') -第二个参数应该是"r",而不是'r'

我在这两行代码中至少发现了3个额外的问题:

  • 在从文件读取之前,作者不会验证fopen调用是否成功;
  • 从不使用feof作为循环条件-它不会返回true,直到您尝试读取文件末尾之后,这意味着您会频繁地循环一次,并且它不会捕获上一次的实际读取error;
  • Following,您应该检查fgets的结果,以确保它成功。

IMO,这些代码应该写成

代码语言:javascript
复制
fp = fopen( "thefile", "r" );
if ( !fp )
{
  // unable to open file, bail out here
}

for ( numlines = 0; fgets( buffer, sizeof buffer, fp ); numlines++ )
{
  // do stuff with buffer
}

if ( feof( fp ) )
{
  // normal end of file
}
else
{
  // error on read, handle as appropriate
}

虽然您可以在for循环中将fopen作为初始化器表达式的一部分进行调用,但您应该将其作为单独的操作来执行,并确保在进入循环之前成功。

检查fgets的结果作为您的循环条件。如果返回NULL,则检查原因是EOF还是读取错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41884194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档