#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>
(它们之间有标签)
我读了很多问题,但他们的答案对我没有帮助。我想我在某个地方错过了一点,但我看不出问题。是关于直接读取链接的数据列表或其他什么?感谢帮助。 //我再次看着我的代码感谢帮助**(编辑)
答案 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 allocation和virtual 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。我希望你不要指望我们做你的功课。你的程序非常错误,但你会通过自己找到 这些错误来学到很多东西。问别人是适得其反的。