从C中的文件读取时覆盖的结构数组

时间:2017-04-25 19:35:12

标签: c file data-structures linked-list

我正在尝试使用字符串和另一个结构的链表的起始地址构建一个结构数组。来自文件每行的几个字符串将填充到此数据结构中。但每当我回到下一行时,到目前为止我填充的数组和LL的所有变量都将被更改为当前行中的变量。结果,数组的所有元素以及相应的链表在数组的每个元素中给出相同的结果。这是代码。

 struct node 
    {
        char* nodedata;
        struct node* link;
    };

    struct  motief
    {
        char* motiefname;
        struct node* link;
    };

void add_unique_nodes(struct motief*,int,char *);
int unique_motief(struct motief*,char*);

void add_unique_nodes(struct motief* motiefs,int motief_no,char * token)
{
    struct node *temp,*r;
    r = malloc(sizeof(struct node)); 
    r->nodedata = token;

    //for the first node
    if(motiefs[motief_no].link == NULL)
    {
        motiefs[motief_no].link = r;
    }
    else
    {
        temp = motiefs[motief_no].link;
        while(temp->link != NULL && token != temp->nodedata)
            temp = temp->link;
        if(token != temp->nodedata)
            temp->link = r;

    }
    r->link = NULL;
}
void main()
{
    struct motief motiefs[100];

    FILE *fp, *ft;
    fp = fopen("dump.txt","r");
    ft = fopen("motief_nodes","w");

    char line[100] ={0};

    char seps[] = ",";
    char* token;

    int motief_no = 0;



    int i,j;//loop variable

    //read the database
    while(!feof(fp))
    {
        if( fgets(line, sizeof(line), fp ))
        {
            if(motief_no == 1)
                printf("for start of 2nd step %s\t",motiefs[0].motiefname);//????
            printf("for line %d\t",motief_no);
            //get the motief from each input line as a token
            token = strtok (line, seps);

            //store it in motief array
            motiefs[motief_no].motiefname = token;
            printf("%s\n",motiefs[motief_no].motiefname);
            if(motief_no == 1)
                printf("for zero %s\n",motiefs[0].motiefname);
            motiefs[motief_no].link = NULL;

            //get and store all the nodes
            while (token != NULL)
            {
                //get the node
                token = strtok (NULL, seps);
                if(token != NULL)
                    add_unique_nodes(motiefs,motief_no,token);

            }
            if(motief_no == 0)
                printf("for end of 1st step %s\n",motiefs[0].motiefname);
            motief_no++; 
            if(motief_no == 2)//break at 2nd loop, at 1
            break;
        }

我是C编程新手。我找不到为什么会这样。请帮助我找出我出错的地方以及为什么在我的代码中为了那个目的而将文件读入数组之外的指定变量。提前致谢。以下是要读取的文件中的几行。

000100110,1,95,89
000100111,1,95,87
000100110,1,95,74
000100110,1,95,51

我正在使用以下代码显示结构

struct node* temp;
for(j=0;j<2;j++)
{
    printf("turn %d\t",j);
    printf("%s\t",motiefs[j].motiefname);
    temp = motiefs[j].link;
    printf("%s\t",temp->nodedata);
    do 
    {
        temp = temp->link;
        printf("%s\t",temp->nodedata);
    }while(temp->link != NULL);
    printf("\n");
}

它显示以下整体结果

for line 0  000100110
   for end of 1st step 000100110
   for start of 2nd step 000100111,1,95,87
for line 1  000100111
for zero 000100111
turn 0  000100111   1   95  87

turn 1  000100111   1   95  87

1 个答案:

答案 0 :(得分:0)

当您阅读&#39; line&#39;时,您会不断更改相同的内存空间。每次需要不同的数组时,都需要分配新的内存空间。

图片&#39; line&#39; as 指向到一行中100个字节的特定块。你一直告诉fgets函数写入该位置,并且当你分配&#39;令牌时,你还会继续将该位置的地址复制到你的结构中。到moteifname。

然后当你改变该地址的内容时,它当然会覆盖结构所指的内容!

您需要选择在每个结构中分配空间而不是使用内部指针,或者您需要使用malloc在每次迭代中动态分配空间,然后在末尾使用free()所有指针。

https://www.codingunit.com/c-tutorial-the-functions-malloc-and-free