C语言 混淆fread,fseek精确操作

n6lpvg4x  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(113)

C代码:代码1的一部分:

#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <stdio.h>
#define READONLY        "r"
#define UPDATE          "r+"
#define FALSE            0
#define TRUE             1

typedef  int              Boolean;

# define ERROR            -1

typedef  struct {
   int identification ;
   char name[NAMESIZE] ;
   char subject[SUBJECTSIZE] ;
   int  grade ;
} RECORD ;
typedef  struct {
                 char type ;
                 RECORD student ;
                } TRANSACTION ;
typedef  struct {
                  char occupied ;
                  RECORD student ;
                } MASTER ;

部分代码2:

void  main(int argc, char *argv[])
 {
   FILE     *fpmas,*fptrans ;
   int      current_key ,
            relative_record_number ;
   boolean     allocated;
   TRANSACTION transaction;
   MASTER      master ;
   clrscr();
   prog = argv[0];

代码3的一部分:

int read_master_record(FILE *fp,
        int relative_record_number, MASTER *master)
{
   if(fseek(fp, (long) relative_record_number
           *sizeof(MASTER), SEEK_SET) !=0 )
      return(ERROR) ;
   else if(fread((char *)master, sizeof(MASTER), 1, fp) != 1)
      return(ERROR) ;
   else
      return(relative_record_number) ;
}

我对红色标记区域(在我所附的图像文件中!),(char *)!=0!=1感到困惑,分别在*sizeof(MASTER), SEEK_SET) !=0 )else if(fread((char *)master, sizeof(MASTER), 1, fp) != 1)中。它们是什么意思?!我搜索了这些,但一无所获。有人能提供关于这些主题的任何文件或任何解释吗?!
Question on Red Marks!

oxf4rvwz

oxf4rvwz1#

首先,让我们用英语把这些部分分解开来,然后,我们可以确定一个意思。
第一条:

if(fseek(fp, (long) relative_record_number
           *sizeof(MASTER), SEEK_SET) !=0 )

如果fseek的返回代码不为0,则返回错误。如果成功,则fseek的返回值为0。因此,!= 0 =失败。
第二个声明:

else if(fread((char *)master, sizeof(MASTER), 1, fp) != 1)

转换是不必要的,更多的是为了文档。将任何指针转换为char*总是安全的。这是一种说“我将此结构作为原始字节发送”的方式。
如果fread的返回值不为1,则返回错误。fread的返回值为:

On success, fread() and fwrite() return the number of items read
       or written.  This number equals the number of bytes transferred
       only when size is 1.  If an error occurs, or the end of the file
       is reached, the return value is a short item count (or zero).

这里,我们检查返回值!= 1是否正确。因此,我们检查fread是否正确读取了1项。

相关问题