在课堂上,我遇到了以下代码片段
for (numlines = 0, (fp=fopen("thefile",'r')); feof(fp); numlines++ ) {
fgets(fp, buffer, sizeof(buffer), fp);
...
}在for-loop头中,可以初始化两件事,即numlines和fp,对吗?
然后在for循环的主体中,
fgets(fp, buffer, sizeof(buffer), fp);这就是让我困惑的地方..我以为fgets()函数会接受这些参数
char *fgets(char *str, int n, FILE *stream)你知道这两个fps在做什么吗?
发布于 2017-01-27 07:14:21
知道这两个fps在做什么吗?
这是一个打字错误--作者在写那句话的时候显然弄错了。编译器应该会抱怨这个调用。
它还应该抱怨fp=fopen("thefile",'r') -第二个参数应该是"r",而不是'r'。
我在这两行代码中至少发现了3个额外的问题:
fopen调用是否成功;feof作为循环条件-它不会返回true,直到您尝试读取文件末尾之后,这意味着您会频繁地循环一次,并且它不会捕获上一次的实际读取error;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作为初始化器表达式的一部分进行调用,但您应该将其作为单独的操作来执行,并确保在进入循环之前成功。
检查fgets的结果作为您的循环条件。如果返回NULL,则检查原因是EOF还是读取错误。
https://stackoverflow.com/questions/41884194
复制相似问题