C语言中file函数链表读取txt文本出现了乱码
#include<stdio.h>#include<stdlib.h>typedefstructnode{charname[20];intscore;intnum;str...
#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
展开
2个回答
展开全部
提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读进来放在字符串的最后)
2016-07-12
展开全部
#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("1.txt", "r+");
node *head = NULL;
head = creat(head, fp, 3);
print(head);
//没有free掉malloc出来的链表,有内存泄漏
}
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%*c", &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\n", q->score, q->num);//加换行打印
q = q->next;
}
}
追问
感谢你的详细的回答,我目前的理解是我的fscanf读取之后,也就是txt文本中我要读取的数字之后有一个回车换行符,然后它一直在缓冲区,结果被下一个创建的列表的时候读取文件数据的name变量给读取了,所以出现了乱码,是不是这样的。
追答
fgets读了上一个fscanf留下来的换行符,然后fscanf两次读一个字符串为数字,读不成功,不改变score跟num的值,所以得到一个
name = \n
score = 读Michael,失败,不改变score的值,得到随机值,如果是MS编译器,因为是heap申请的所以会被赋值为0xcdcdcdcd
num = 同score,总之就是没有读成功
然后下一个节点,从Michael开始读,是成功的,然后3个节点了,跳出
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询