C语言fread第二个值和第三个值调换的问题
fread不是第二个值设置为1第三个值就是文件的大小吗,为什么我第二个值设置为1输出的时候出现乱码呢还有个问题是,第一个值是不是必须填字符串首元素地址,还是可以填字符串的地址呢
例如:下面代码中的&s和和&s
是都可以还是必须要&s呢
https://raw.githubusercontent.com/alexnijd/test/master/fread%E5%87%BA%E9%94%99_1.Png
# include <stdio.h>
# include <string.h>
typedef struct stu
{
int age;
char name;
float score;
}st;
int main()
{
FILE *fp = fopen("d:/stu","rb");
st s;
int ret = fread(&s,1,sizeof(s),fp);
printf("%d\n",ret);
for(int i=0;i<ret;i++)
{
printf("%d, %s, %f\n",s.age,s.name,s.score);
}
fclose(fp);
}
/*
FILE *fp = fopen("d:/stu","wb");
st s={18,"mike",59,
22,"jing",66,
33,"lily",77,
44,"lucy",88
};
int ret = fwrite(&s,sizeof(st),4,fp);
这一段是建文本的代码
*/
我发现是我的问题我变量值赋值错了
还是第二个问题,第一个值是不是必须填字符串首元素地址 本帖最后由 superbe 于 2019-9-26 16:22 编辑
1. fread函数第2个参数是每项的字节数,第3参数是要读取的项数,返回实际读取的项数。这行int ret = fread(&s,1,sizeof(s),fp);是按每项一个字节读取,返回240,导致下面for循环s[ i ]越界,输出不正确。
改法一:
for(int i=0;i<4;i++) 或for(int i=0;i<ret/sizeof(st);i++)
改法二:
int ret = fread(&s,sizeof(st),6,fp); 或
int ret = fread(s,sizeof(st),6,fp); 或
int ret = fread(&s,sizeof(st),6,fp);
6是数组长度(元素个数),可以用sizeof(s)/sizeof(s)代替。
2. &s和s和&s在数值上地址相等,但含义不一样,前两个都是指向数组第一个元素,而&s是指向整个数组,例如下面代码:
st s;
st *p,(*p2);
p=s; //正确
p=&s; //正确
p=&s; //错误
p2=&s; //正确
fread函数用这三种都可以,是因为第1个参数是void *类型,不是固定的int* 或 double*等,实际参数都会被转换成指向void的指针类型,这种指针可用为一种通用类型的指针。
页:
[1]