#include<stdio.h>#include<stdlib.h>typedef struct node{ char name[20]; int score; int num; struct node *next;}node;void main(){ node * creat(node *head,FILE *fp,int n); void print(node *head); FILE *fp; fp=fopen("d:\\1.txt","r+"); node *head=NULL; head=creat(head,fp,3); print(head);}node * creat(node *head,FILE *fp,int n){ node*p; node*q; int i; for(i=0;i<n;i++) { q=(node *)malloc(sizeof(node)); fflush(stdin); fgets(q->name,sizeof(q->name),fp); fscanf(fp,"%d",&q->score); fscanf(fp,"%d",&q->num); q->next=NULL; if(NULL==head) head=q; else p->next=q; p=q; } return head;}void print(node *head){ node*q; q=head; while(NULL!=q) { printf("%s",q->name); printf("%d %d",q->score,q->num); q=q->next; }}txt中的图片如何图所示,这样读取之后结果显示为:Simon Hu100 1511464299113 1852400220Michael65 1560 0
提3条修改建议,保证通过。
删除fflush(stdin);。fflush(stdin)是清除标准输入缓冲区,与文件读入不搭界。
将fscanf(fp,"%d",&q->num);中的"%d"改为"%d ",d后的空格会吸收掉文件中的广义空格。(前一句可改可不改,因为这一句会自动跳过广义空格)
将print函数中的printf("%d %d",q->score,q->num);一句改为printf("%d %d\n",q->score,q->num);,以使输出第二个整数后回车,让版面标准化。(前面输出字符串时不需要,因为fgets函数会把\n读进来放在字符串的最后)
感谢你的详细的回答,我目前的理解是我的fscanf读取之后,也就是txt文本中我要读取的数字之后有一个回车换行符,然后它一直在缓冲区,结果被下一个创建的列表的时候读取文件数据的name变量给读取了,所以出现了乱码,是不是这样的。
追答fgets读了上一个fscanf留下来的换行符,然后fscanf两次读一个字符串为数字,读不成功,不改变score跟num的值,所以得到一个
name = \n
score = 读Michael,失败,不改变score的值,得到随机值,如果是MS编译器,因为是heap申请的所以会被赋值为0xcdcdcdcd
num = 同score,总之就是没有读成功
然后下一个节点,从Michael开始读,是成功的,然后3个节点了,跳出