C编程,fscanf只输入最后一个元素

时间:2017-08-14 19:14:30

标签: c file linked-list

我正在尝试从文件中获取多个元素并将其放入我的数组链表中,但它只输入文件的最后一个元素。

文件内部是

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 

这是我的代码

typedef struct node{
    int elem;
    struct node *next;
}node;

void insert(node **a)
{
    int temp,elem;
    node *tempstruct;
    tempstruct = (*node)malloc(sizeof(struct node));
    FILE *fp;
    if(fp = fopen("input.txt","r")){
        while(fscanf(fp,"%d",&elem)==1){
            temp = elem%10;
            tempstruct->elem = elem;
            tempstruct->next = a[temp];
            a[temp] = tempstruct;
        }
    }
}

预期输出应为

A[0]   10
A[1]   11   1
A[2]   12   2 
A[3]   13   3 
A[4]   14   4
A[5]   15   5 
A[6]   16   6
A[7]   17   7
A[8]   18   8
A[9]   19   9

但我得到的是

A[0]   19
A[1]   19
A[2]   19
A[3]   19
A[4]   19
A[5]   19
A[6]   19
A[7]   19
A[8]   19
A[9]   19

我正在尝试将索引中的元素放在与其数字对应的索引中,但它所放置的是最后一个19的元素。

1 个答案:

答案 0 :(得分:2)

您只能一次调用malloc,因此最终会遇到阵列中所有元素都指向同一对象的情况。相反,您应该为每次成功扫描调用malloc

像:

void insert(node **a)
{
    int temp,elem;
    node *tempstruct;
    FILE *fp;
    if(fp = fopen("input.txt","r")){
        while(fscanf(fp,"%d",&elem)==1){
            tempstruct = malloc(sizeof(struct node));  // malloc inside the loop
            temp = elem % 10;      // Find the index where the new object shall be added
            tempstruct->elem = elem;
            tempstruct->next = a[temp];
            a[temp] = tempstruct;
        }
    }
}