首页 > 试题广场 >

若有以下定义和说明: struct student {

[单选题]
若有以下定义和声明:
struct student {
    char num[6];
    char name[8];
    float mark[4];
} a[30];

FILE *fp;
设文件中以二进制形式存有10个班的学生数据,且已正确打开,文件指针定位于文

件开头。若要从文件中读出30个学生的数据放入a数组中,以下能实现此功能的语句

是()
  • for (i=0;i<30;i++)  fread (&a[i],sizeof(struct student),1L,fp);
  • for (i=0;i<30;i++)  fread (&a[i],sizeof(struct student),30L,fp);
  • fread (a,sizeof(struct student),L,fp);
  • for (i=0;i<30;i++)  fread(a[i],sizeof(struct student),1L,fp);
fread(pt,size,n,fp)指从fp指定的文件中读取长度为size的n个数据项,存入pt所指向的内存区,但由于这里是循环读取,每次循环读取一个,所以n=1,答案选A
发表于 2018-06-25 15:45:43 回复(1)
fread()函数:
1. 作用:从一个文件流中读取数据
2. 函数原型如下:
        size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
          -- buffer:指向数据块的指针
          -- size:每个数据的大小,单位为Byte(例如:sizeof(int)就是4)
          -- count:数据个数
          -- stream:文件指针
注意:返回值随着调用格式的不同而不同:
(1) 调用格式:fread(buf,sizeof(buf),1,fp);
读取成功时:当读取的数据量正好是sizeof(buf)个Byte时,返回值为1(即count)
                       否则返回值为0(读取数据量小于sizeof(buf))
(2)调用格式:fread(buf,1,sizeof(buf),fp);
读取成功返回值为实际读回的数据个数(单位为Byte) 
发表于 2019-03-01 11:29:22 回复(0)
b答案去掉前面的循环体也是对的
发表于 2018-10-01 17:06:40 回复(0)
fread(&a[i],sizeof(struct,std),1L,fp)的意思就是,从文件fp中只读1L次长度为sizeof(struct,std)这么长的内容存在数组第i个位置。(每次循环)。请注意这里是&a[i]而不是a[i],&a[i]是将从fp中取出的值存在i这个位置上了,而a[i]代表的是地址,如果写a[i]的话就是将i的地址替换成了从fp中取出的值

编辑于 2018-09-04 20:17:47 回复(0)
A是对的
还有  fread(a,sizeof(struct std),30L,fp);也是对的
发表于 2020-05-02 09:10:49 回复(0)

在这段代码中,1L表示一个长整型(long int)的字面量。在C/C++中,字面量的类型取决于其后缀。在这里,后缀L表示这是一个长整型的字面量。

在fread函数中,第三个参数表示要读取的数据块的个数。因此,1L表示只读取一个数据块的内容。

实际上,后缀L在这里并不是必需的,因为1默认被解释为整数。因此,可以简单地写作:

cppCopy Code
for (i=0; i<30; i++) fread(&a[i], sizeof(struct student), 1, fp);

这样也是完全合法的,并且更为常见。

发表于 2023-11-13 10:08:32 回复(0)
如果写成a[i],是把a[i]的值看成地址,取fp的内容放到这个地址上。
发表于 2019-01-04 12:01:26 回复(1)