| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2821 人关注过本帖
标题:将stu_list.txt中的内容读进结构体中我用fread读总出错,求助
只看楼主 加入收藏
考拉的儿子
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-5-19
结帖率:0
收藏
已结贴  问题点数:5 回复次数:6 
将stu_list.txt中的内容读进结构体中我用fread读总出错,求助
我知道fread主要是用来读二进制流的数据块,但看了国外的书上说读文本流也是可以的。如果用文本流专用的fgets ,一次只能读一个字符,那不累死了?我做这个主要是做一个计算,数据很多。
  我的文本是先写好放在那的,只是用C来读这个TXT文件。结果是会有乱码,而且我明明定义了4次循环(只输出四行),但确输出了八行。大家可以运行下看看。谢谢
stu_list.txt:
Zhang  1001  19  room_101
Fun    1002  20  room_102
Tan    1003  21  room_103
Ling   1004  21  room_104



#include<stdio.h>
#define SIZE 4
struct student_type /*定义结构体数组*/
{char name[15];
 int num;
 int age;
 char addr[100];
}stud[SIZE];
void main(void)
{int i,n;
 FILE *fp; /*定义文件型指针变量*/
 fp=fopen("stu_list.txt","r");/*打开文件。其中参数为要读的文件名(包含后缀名)加路径(若不加路径则只能放在.c文件所在的文件夹下)和打开方式*/
 if(fp==NULL)/*确保文件指针不是空指针*/
 {printf("不能打开该文件\n");
  exit(0);/*关闭所有文件,终止正在执行的程序*/
 }
 for(i=0;i<SIZE;i++)
 {fread(&stud[i],sizeof(stud[i]),1,fp);/*读数据块。其中&stud[i]位置是读入数据的存放地址,&stud[i]指结构体数组的某个结构体变量stud[i]的地址;sizeof位置是要读的字节数;1位置是要读多少个size字节的数据项;fp是前面已定义的文件型指针变量*/
  printf("%s%d%d%s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);/*输出结构体数组的每个元素(即结构体变量)中的每个成员的值*/
 }
 fclose(fp);
}

[ 本帖最后由 考拉的儿子 于 2011-5-19 18:00 编辑 ]
搜索更多相关主题的帖子: 结构体 二进制 
2011-05-19 16:39
Storm0305
Rank: 1
等 级:新手上路
帖 子:16
专家分:1
注 册:2011-3-5
收藏
得分:1 
楼主说清楚额,是存在什么样的问题啊?
还有,你数据存储是怎样实现的?
2011-05-19 17:01
林浩
Rank: 2
等 级:论坛游民
帖 子:47
专家分:23
注 册:2011-1-12
收藏
得分:1 
fread的确既可以读2进制流,也可以读文本的,
到底出错时因为你fwrite问题,还是fread问题呢
2011-05-19 17:16
考拉的儿子
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-5-19
收藏
得分:0 
我的文本是先写好的放在那的,只是用C来读这个TXT文件。结果是会有乱码,而且我明明定义了4次循环(只输出四行),但确输出了八行。你可以运行下看看
2011-05-19 17:59
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:1 
程序代码:
#include<stdio.h>
#include <stdlib.h>
#define SIZE 4
struct student_type /*定义结构体数组*/
{char name[15];
int num;
int age;
char addr[100];
}stud[SIZE];
void main(void)
{int i,n;
FILE *fp; /*定义文件型指针变量*/
fp=fopen("message.txt","r");/*打开文件。其中参数为要读的文件名(包含后缀名)加路径(若不加路径则只能放在.c文件所在的文件夹下)和打开方式*/
if(fp==NULL)/*确保文件指针不是空指针*/
{printf("不能打开该文件\n");
  exit(0);/*关闭所有文件,终止正在执行的程序*/
}
for(i=0;i<SIZE;i++)
{fscanf(fp,"%s %d %d %s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);/*读数据块。其中&stud[i]位置是读入数据的存放地址,&stud[i]指结构体数组的某个结构体变量stud[i]的地址;sizeof位置是要读的字节数;1位置是要读多少个size字节的数据项;fp是前面已定义的文件型指针变量*/
  printf("%6s %6d %6d %6s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);/*输出结构体数组的每个元素(即结构体变量)中的每个成员的值*/
}
fclose(fp);
}
图片附件: 游客没有浏览图片的权限,请 登录注册
楼主试试fscanf这个函数我经常用  很好使的

                                         
===========深入<----------------->浅出============
2011-05-19 20:23
考拉的儿子
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-5-19
收藏
得分:0 
回复 5楼 laoyang103
好,我来试试看。但我想知道fread错在哪了,国外的书上说是可以用来读文本的,只是一般用来读二进制流。
2011-05-19 20:47
baobaoisme
Rank: 7Rank: 7Rank: 7
来 自:AVATAR
等 级:黑侠
帖 子:260
专家分:506
注 册:2010-7-9
收藏
得分:1 
这个问题论坛以前也经常问的,你想想你的结构体定义多大,而你的txt文件每行记录里面有制表符,空格符回车符,你读的时候会把这些无关字符一起当二进制流读操作,显然读入每行的数据大小要大于你自己定义的结构体大小,这样肯定就不对了,最好不要用fread读非二进制流文件
2011-05-19 22:19
快速回复:将stu_list.txt中的内容读进结构体中我用fread读总出错,求助
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026856 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved