从文件中读取数据并将其写入链接列表

时间:2016-11-06 12:51:09

标签: c linked-list text-files scanf

#include<stdio.h>
struct Node{
    char *name;
    int time;
    int sec; 
    int x;
    int y;
    struct Node *next;
};
int main(){
    FILE *file;
    int index;
    struct Node *data=malloc(sizeof(struct Node));
    struct Node *tmp=data,*tmp2=data;
    int enter;

    file=fopen("data.txt","r");

    if(file==NULL){
        printf("File was not opened!\n");
        return 0;
    }

    while(!feof(file)){
        tmp=malloc(sizeof(struct Node));
        fscanf(file,"%d",&index);
        fscanf(file,"%d",&tmp->time);
        fscanf(file,"%d",&tmp->sec);
        fscanf(file,"%d",&tmp->x);
        fscanf(file,"%d",&tmp->y);
        fscanf(file,"%s",tmp->name);
        fscanf(file,"%'\0",&enter);
        tmp->next=NULL;
        tmp=tmp->next;
    }
    fclose(file);
    while(tmp2 != NULL){
        printf("file:%d\t%d\t%d\t%d\t%s\n",tmp2->timestamp,tmp2->sec,tmp2->pointx,tmp2->pointy,tmp2->name);
        tmp2=tmp2->next;
    }
    return 0;
}

需要帮助从文件中读取数据并将其写入链接列表,然后将链接列表打印到secreen.But它在我启动程序后立即停止工作。在文件数据中是这样的:< / p>

  • 1 28000 41 29 50 bbb
  • 2 29000 91 19 60 ccc
  • 3 30000 23 77 92 ddd
  • 4 30000 37 62 65 eee
  • 5 31000 14 45 48 fff

(它们之间有标签)

我读了很多问题,但他们的答案对我没有帮助。我想我在某个地方错过了一点,但我看不出问题。是关于直接读取链接的数据列表或其他什么?感谢帮助。 //我再次看着我的代码感谢帮助**(编辑)

1 个答案:

答案 0 :(得分:3)

name字段是指针,但您永远不会分配它。所以

    fscanf(file,"%s",tmp->name);

undefined behavior。你真的应该是very scared。花几个小时阅读Lattner的博客:what every C programmer should know about undefined behavior

如果在POSIX系统上读取一行,也许可以使用getline(3),或者使用fgets(3)

BTW,当我用所有警告编译你的代码&amp;调试信息(如果使用GCC,则使用gcc -Wall -g)我收到很多错误和警告。你应该改进你的代码,直到你没有警告。然后你应该使用调试器(gdb)来查找许多其他错误。您将能够逐步运行您的错误程序并查询一些变量。您应该在黑板上(或在纸上)绘制您认为运行程序的process的内存(包括堆)的模型和形状。你会发现几个错误。详细了解C dynamic memory allocationvirtual address space

此外,使用malloc(3)

时需要#include <stdlib.h>

请阅读您正在使用的每个功能的文档,尤其是fscanf

请注意,您忘记处理malloc的失败;我还建议在失败的情况下使用perror(3)。所以至少用

替换tmp=malloc(sizeof(struct Node));
tmp = malloc(sizeof(struct Node));
if (!tmp) { perror("malloc Node"); exit(EXIT_FAILURE); };

PS。我希望你不要指望我们做你的功课。你的程序非常错误,但你会通过自己找到 这些错误来学到很多东西。问别人是适得其反的。