seglex 发表于 2019-9-25 19:12:27

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);
        这一段是建文本的代码
*/

seglex 发表于 2019-9-25 19:57:10

我发现是我的问题我变量值赋值错了
还是第二个问题,第一个值是不是必须填字符串首元素地址

superbe 发表于 2019-9-26 11:38:01

本帖最后由 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]
查看完整版本: C语言fread第二个值和第三个值调换的问题