C编程,文件,链表

时间:2017-11-13 14:43:30

标签: c

该程序将从文件中读取您的朋友,并使用链接列表存储您朋友的详细信息。 请注意,您不能对您的朋友数量做出任何假设 朋友的数量没有上限。

有我的代码,它不起作用。我用了strtok ......

文件内容应为:

Name1; Surname1;M;01.06.1990;
Name2;Surname2;F;02.04.1992;

这是我的代码:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

struct Friend{
char  *name;
char  *sur;
char  *gen;
char  *date;
struct Friend *next;
};
struct Friend * initialize(char *);
void display(struct Friend *);
int main()
{
printf("\nsdasda\n");
struct Friend *head;
char fname[100];
printf("Enter the name of file .txt:  \t");
gets(fname);
head=initialize(fname);
display(head);

}
struct Friend * initialize(char *fname){
FILE* fpointer;
char ch;
fpointer = fopen(fname,"r");
if(fpointer == NULL){

    do
    {
        printf("\nFile not found, please enter the name of file again: \t");
        gets(fname);
        fpointer = fopen(fname,"r");
    }while(fpointer == NULL);
}
//FILE IS OPENED
struct Friend *head=(struct Friend*)malloc(sizeof(struct Friend));
struct Friend *t;
t=head;
char line[255];
char sent[2]=";";

while(!feof(fpointer)){
fgets(line,sizeof line,fpointer);
t->name=strtok(line,sent);
t->sur=strtok(NULL,sent);
t->gen=strtok(NULL,sent);
t->date=strtok(NULL,sent);
if(!feof(fpointer)){
t->next=(struct Friend*)malloc(sizeof(struct Friend));
t=t->next;
}
else if(feof(fpointer)){

t->next=NULL;

}

}

return head;

};

void display(struct Friend *head){
puts(head->name);
}

1 个答案:

答案 0 :(得分:2)

这里有很多问题,不一定要详尽无遗:

  • gets不安全,绝对不能使用。了解如何使用fgets这是一个更安全的替代方案
  • while(!feof(fpointer))几乎总是错的。在读完最后一行后,feof仍为假,只有在第一次不成功的读操作后才会为真。因此,文件结尾的测试必须介于读取和处理数据之间。
  • 不要在C中投射malloc!如果你有间接级别错误,它是无用的,只能隐藏编译器警告
  • 永远不要在可重复使用的字符串中指定char指针。您只存储地址并在下次读取时删除内容。为每个新字符串分配内存或使用strdup来完成它(BTW,这可能是导致您不能正常工作的原因)。
  • 始终免费分配您的内容,使用malloc strdup或内部任何其他功能使用malloc
  • 总是从main返回一个合理的环境值。真正的程序不是从IDE运行的......