【问题标题】:C stdio fgets()C 标准输入法 fgets()
【发布时间】:2017-01-26 22:34:54
【问题描述】:

在课堂上,我遇到了这个代码sn-p

for (numlines = 0, (fp=fopen("thefile",'r')); feof(fp); numlines++ ) { 
    fgets(fp, buffer, sizeof(buffer), fp);
    ...
}

在for循环头中,可以初始化numlinesfp这两个东西,对吧?

然后在for循环体中,

fgets(fp, buffer, sizeof(buffer), fp);

这让我很困惑。我认为fgets() 函数采用这些参数

char *fgets(char *str, int n, FILE *stream)

知道 2 fps 在做什么吗?

【问题讨论】:

  • 一个错误?那甚至不应该编译。除非代码重新定义 fgets 或做一些其他的诡计(这会很糟糕)。
  • 那个代码 sn-p 是纯垃圾,句号。
  • 你在哪里遇到的?也许发现问题是练习的目标。 feof(fp) 也是错误的。
  • @namesake22 您可以找到任何质量差的代码。但是为什么要讨论呢?:)
  • fopen("thefile",'r') 应该肯定引起编译器警告。

标签: c fgets stdio


【解决方案1】:

知道 2 fps 在做什么吗?

这是一个错字——作者在写这句话时显然是搞错了。编译器应该抱怨那个调用。

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

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

  • 作者在读取文件之前没有验证fopen调用是否成功;
  • 从不使用feof作为循环条件-直到之后您尝试读取文件末尾之后才会返回true,这意味着您也将循环一次通常,它不会捕获实际的读取错误;
  • 继上一个之后,您应该检查fgets 的结果以确保它成功。

IMO,代码应该写成

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 作为初始化表达式的一部分调用,但您应该将其作为单独的操作进行并确保它在之前成功 em> 进入循环。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多