我有以下方法将文件读取到结构中,但是,由于curr
变量为空,当程序到达写文件方法时,程序正在轰炸。
当变量被标记化时,我添加了一个null检查,但在这一点上不会抛出错误。我猜这与我将数据复制到newContact
的方式有关,但我看不出我在哪里搞砸了。
这是提到的读取文件的方法,标记变量并添加newContact
:
struct contact *readFile(char * FName,struct contact** ptrList)
{
struct contact *head, *newContact;
FILE *fptr;
char oneLine[60];
char *sname, *fname, *phone,*company, *email;
head = *ptrList;
fptr = fopen(FName,"r");
if(fptr == NULL)
{
printf("nCant open file!");
return(ptrList);
}
fgets(oneLine, 55, fptr);
while(!feof(fptr))
{
fgets(oneLine, 55, fptr);
if(oneLine[strlen(oneLine)-1] == 'n')
{
oneLine[strlen(oneLine)-1] = ' ';
}
// open file and other stuff
if(!ptrList) return; // invalid pointer
for(head=*ptrList;head&&head->next;head=head->next);
while( ReadLine(fptr,oneLine) )
{
//check that variables aren't empty here:
if(sname == NULL || fname == NULL)
{
printf("nvariable empty!");
//return(ptrList);
}
sname = strtok(oneLine,",");
fname = strtok(NULL,",");
phone = strtok(NULL,",");
company = strtok(NULL,",");
email = strtok(NULL,",");
newContact = (struct contact *)malloc(sizeof(struct contact));
if(!newContact) break; // out of memory
newContact->prev = head;
newContact->next = 0;
//copy the data to the new one
strcpy(newContact->sname,sname);
strcpy(newContact->fname,fname);
strcpy(newContact->phone,phone);
strcpy(newContact->company,company);
strcpy(newContact->email,email);
head = newContact;
if(!*ptrList) *ptrList = head; // see: point 2
}
}
这是struct
声明:
struct contact {
char sname[15];
char fname[15];
char phone[15];
char company[15];
char email[15];
struct contact *prev;
struct contact *next;
};
我在ReadLine
中也得到了一个未定义的错误。有没有我应该为这个函数导入的库(因为我在搜索中看不到任何提到的库(?
while( ReadLine(fptr,oneLine) )
新错误出现在这里:
head = *ptrList;
有什么关于它为什么爆炸的想法吗?
head = newContact;
if(!*ptrList) *ptrList = head; // see: point 2
我相信,你已经在名单的末尾了。我认为没有必要发表这种"如果"的声明。我们从不更改列表的实际"头",这就是"ptrList"所指向的位置。
另外,你不想在第一个while循环之外使用下面的for循环吗?该代码正试图从文件中读取并添加到列表的末尾。我认为没有必要遍历文件的每一行的循环。
for(head=*ptrList;head&&head->next;head=head->next);