鱼C论坛

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

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

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

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

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

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


                               
登录/注册后可看大图

  1. # include <stdio.h>
  2. # include <string.h>
  3. typedef struct stu
  4. {
  5.         int age;
  6.         char name[50];
  7.         float score;
  8. }st;
  9. int main()
  10. {
  11.         FILE *fp = fopen("d:/stu","rb");
  12.         st s[6];
  13.         int ret = fread(&s[0],1,sizeof(s),fp);
  14.         printf("%d\n",ret);
  15.         for(int i=0;i<ret;i++)
  16.         {
  17.                 printf("%d, %s, %f\n",s[i].age,s[i].name,s[i].score);
  18.         }
  19.         fclose(fp);
  20. }
  21. /*
  22.         FILE *fp = fopen("d:/stu","wb");
  23.         st s[4]={18,"mike",59,
  24.         22,"jing",66,
  25.         33,"lily",77,
  26.         44,"lucy",88
  27.         };
  28.         int ret = fwrite(&s[0],sizeof(st),4,fp);
  29.         这一段是建文本的代码
  30. */
复制代码
最佳答案
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-5-18 17:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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