C语言中file函数链表读取txt文本出现了乱码

#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读进来放在字符串的最后)

温馨提示:答案为网友推荐,仅供参考
第1个回答  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个节点了,跳出

本回答被提问者和网友采纳
相似回答