C中的随机访问函数问题

sta*_*rob 2 c

我正在努力学习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结束?这个代码比它需要的更难吗?

Mic*_*urr 5

代码只是检查错误. fseek()成功时返回0,失败时返回非零. ftell()失败时返回-1.

至于"为什么位置为零?" - fseek()呼叫请求从文件末尾搜索(SEEK_END).文件末尾的零字节是..文件的结尾.所以

fseek( fp, 0L, SEEK_END )
Run Code Online (Sandbox Code Playgroud)

是将文件指针移动到文件末尾的请求.

该代码执行以下步骤:

  1. 打开文件
  2. 寻求到底
  3. 得到文件指针的位置(因为我们最后会告诉你文件中有多少字节 - 注意,严格来说,文件需要用二进制访问打开,例如使用"rb",为此是真实的)

错误处理使代码有些复杂.正是出于这个原因,许多书籍和文章都忽略了错误处理.然而,这有教导人们忽略错误条件的缺点.