鱼C论坛

 找回密码
 立即注册
查看: 1450|回复: 2

[已解决]C语言fread第二个值和第三个值调换的问题

[复制链接]
发表于 2019-9-25 19:12:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
fread不是第二个值设置为1第三个值就是文件的大小吗,为什么我第二个值设置为1输出的时候出现乱码呢
还有个问题是,第一个值是不是必须填字符串首元素地址,还是可以填字符串的地址呢
例如:下面代码中的&s和和&s[0]
是都可以还是必须要&s[0]呢


                               
登录/注册后可看大图
# include <stdio.h>
# include <string.h>
typedef struct stu
{
        int age;
        char name[50];
        float score;
}st;
int main()
{
        FILE *fp = fopen("d:/stu","rb");
        st s[6];
        int ret = fread(&s[0],1,sizeof(s),fp);
        printf("%d\n",ret);
        for(int i=0;i<ret;i++)
        {
                printf("%d, %s, %f\n",s[i].age,s[i].name,s[i].score);
        }
        fclose(fp);
}
/*
        FILE *fp = fopen("d:/stu","wb");
        st s[4]={18,"mike",59,
        22,"jing",66,
        33,"lily",77,
        44,"lucy",88
        };
        int ret = fwrite(&s[0],sizeof(st),4,fp);
        这一段是建文本的代码 
*/
最佳答案
2019-9-26 11:38:01
本帖最后由 superbe 于 2019-9-26 16:22 编辑

1. fread函数第2个参数是每项的字节数,第3参数是要读取的项数,返回实际读取的项数。这行int ret = fread(&s[0],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[0],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[0])代替。

2. &s[0]和s和&s在数值上地址相等,但含义不一样,前两个都是指向数组第一个元素,而&s是指向整个数组,例如下面代码:
    st s[6];
    st *p,(*p2)[6];
    p=s;    //正确
    p=&s[0];    //正确
    p=&s;    //错误
    p2=&s;    //正确
fread函数用这三种都可以,是因为第1个参数是void *类型,不是固定的int* 或 double*等,实际参数都会被转换成指向void的指针类型,这种指针可用为一种通用类型的指针。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-9-25 19:57:10 | 显示全部楼层
我发现是我的问题我变量值赋值错了
还是第二个问题,第一个值是不是必须填字符串首元素地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-26 11:38:01 | 显示全部楼层    本楼为最佳答案   
本帖最后由 superbe 于 2019-9-26 16:22 编辑

1. fread函数第2个参数是每项的字节数,第3参数是要读取的项数,返回实际读取的项数。这行int ret = fread(&s[0],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[0],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[0])代替。

2. &s[0]和s和&s在数值上地址相等,但含义不一样,前两个都是指向数组第一个元素,而&s是指向整个数组,例如下面代码:
    st s[6];
    st *p,(*p2)[6];
    p=s;    //正确
    p=&s[0];    //正确
    p=&s;    //错误
    p2=&s;    //正确
fread函数用这三种都可以,是因为第1个参数是void *类型,不是固定的int* 或 double*等,实际参数都会被转换成指向void的指针类型,这种指针可用为一种通用类型的指针。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-4 11:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表