我有以下方法将文件读入结构体,但是,当curr
变量为空时,程序在进入写文件方法时会发生轰炸。
我在变量被标记化时添加了一个空检查但是,它在那时没有抛出错误。我猜它与我将数据复制到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] = '\0';
}
// 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;
关于它为什么轰炸的任何想法?
答案 0 :(得分:0)
head = newContact;
if(!*ptrList) *ptrList = head; // see: point 2
我相信,你已经在列表的最后了。 我不认为需要这个'if'声明。我们永远不会改变列表的实际“头部”,这就是'ptrList'指向的地方。
另外,你不想在第一次循环之外使用下面的'for'循环吗? 代码试图从文件中读取并添加到列表的末尾。 我没有看到需要遍历每行文件的循环。
for(head=*ptrList;head&&head->next;head=head->next);