输出的代码出错了!fread和fscanf区别看文档就好了。
1 /*原来的代码中输出了两个地址, 去掉&就对了,还有一个[i]改为[j]就对了*/ 2 printf("%s %s %c %d %s %s %d %d %d %d %d\n",student[j].stuCount,student[j].name,student[i].grade,student[j].classNum,student[j].phoneNum,student[j].address,student[j].Marktotal,student[j].MarkCh,student[j].MarkMath,student[j].MarkEn,student[j].rankNum);
太感谢了,纠结了半天终于知道拿错了
看来我还是有点粗心~
把你的关键代码帖出来吧,大家可以帮你分析一下
这段代码的年级和排名读取不出来,但别的都能读出来,不知道是什么原因?
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define STUDENT_NUM 1 //学生人数
#define COMMAND_LEN 6 //命令字符数
typedef struct studentMessage
{
char stuCount[11];//学号
char name[12];//姓名
char grade;//年级
int classNum;//班级
char phoneNum[12];//手机号码
char address[20];//住址
//成绩
int Marktotal;//总成绩
int MarkCh;//语文
int MarkMath;//数学
int MarkEn;//英语
int rankNum;//排名
}stuM;
int file(void)
{
stuM student[STUDENT_NUM];
int i,j;
FILE * fp = fopen("E:\\c_test.txt","r");//读文件中的字符
for(i = 0;i < STUDENT_NUM;i++)
{
fscanf(fp,"%s %s %c %d %s %s %d %d %d %d %d\n",student[i].stuCount,student[i].name,&student[i].grade,&student[i].classNum,student[i].phoneNum,student[i].address,&student[i].Marktotal,&student[i].MarkCh,&student[i].MarkMath,&student[i].MarkEn,&student[i].rankNum);//用定义的数组类型接收读取到的字符
if(feof(fp))// 代表着字符串的结束
break;
}
for(j = 0;j < STUDENT_NUM;j++)
{
printf("%3d ",j + 1);
printf("%s %s %c %d %s %s %d %d %d %d %d\n",student[j].stuCount,student[j].name,&student[i].grade,student[j].classNum,student[j].phoneNum,student[j].address,student[j].Marktotal,student[j].MarkCh,student[j].MarkMath,student[j].MarkEn,&student[j].rankNum);
}
getch();
return 0;
}
int main(void)
{
file();
getch();
return 0;
}
fread :以字节位计算长度,按照指定的长度和次数读取数据,遇到结尾或完成指定长度读取后停止.
fscanf :格式化读取,按照指定的格式串进行读取数据,并将数据初始化为指定的格式.所以在文本方式下才能有效的判断数据内容.
其实文本和二进制的差别就在于读取的数据,文本方式会默认为是ASCII码,二进制方式则原样将数据读出.所以文本时候的格式控制如回车,制表符等,二进制的时候是不能有效的自动判断的。
他们的效率要看具体的程序和算法的,否则差别并不会很大.其中fread 最快.因为可以指定读取长度.能够有效的减少I/O操作,硬盘读取才是文件操作最耗时的部分.
关注学习了。。。
关注学习了。。