我正在努力学习C和我正在使用的书(Apress''Learn C')有一章在随机访问功能上非常混乱.以下代码令我困惑:
int GetNumberOfDinos( void ) {
FILE *fp;
long fileLength;
if ( (fp = fopen( kDinoFileName, "r" )) == NULL )
DoError( "Couldn't open file...Goodbye!" );
if ( fseek( fp, 0L, SEEK_END ) != 0 )
DoError( "Couldn't seek to end of file...Goodbye!" );
if ( (fileLength = ftell( fp )) == -1L )
DoError( "ftell() failed...Goodbye!" );
fclose( fp );
return( (int)(fileLength / kDinoRecordSize) );
}
Run Code Online (Sandbox Code Playgroud)
我理解代码的目的,但不了解如何实现该目的.fopen系列很容易理解.fseek和ftell是我的麻烦开始的地方.fseek的参数是文件,偏移量,然后是3个SEEK中的一个.为什么它的条件不是零呢?如果文件确实存在(kDinoFileName),并且他们想要指向该文件的末尾,为什么该位置为零?文件存在,有信息!然后我完全不明白ftell函数将如何以-1L结束?这个代码比它需要的更难吗?
代码只是检查错误. fseek()
成功时返回0,失败时返回非零. ftell()
失败时返回-1.
至于"为什么位置为零?" - fseek()
呼叫请求从文件末尾搜索(SEEK_END
).文件末尾的零字节是..文件的结尾.所以
fseek( fp, 0L, SEEK_END )
Run Code Online (Sandbox Code Playgroud)
是将文件指针移动到文件末尾的请求.
该代码执行以下步骤:
错误处理使代码有些复杂.正是出于这个原因,许多书籍和文章都忽略了错误处理.然而,这有教导人们忽略错误条件的缺点.