距离我立下要写博客的flag已经过去了十天,今天在编写代码的时候获得了一些见解,具体情境是这样的
读入函数是
DAMI* dami_load();
DAMI* dami_load()
{
FILE *fp;
fp = fopen("DAMI_data.txt", "r");
int t = 0, flag = 1;
char ch;
while(!feof(fp))
{
ch = fgetc(fp);
if(ch=='\n')
{
t++;
}
}
fclose(fp);
t--; //由于写入文件时有换行符,所以要多减1
fp = fopen("DAMI_data.txt", "r"); //调整文件指针位置
DAMI *q, *h = NULL;
if(t) //判断是否为空文件,如果没有这条语句,返回的h已经给了空间,但是没有赋值,所以会生成乱码
{
q = (DAMI*)malloc(sizeof(DAMI));
h = (DAMI*)malloc(sizeof(DAMI));
q = h;
h->next = NULL;
while(t--)
{
if(flag) //对于头节点的特殊处理
{
fscanf(fp, "%s %s %s %s %s\n", h->NAME, h->STREET, h->CITY, h->EIP, h->STATE);
flag = 0;
}
else
{
DAMI *p = (DAMI*)malloc(sizeof(DAMI));
fscanf(fp, "%s %s %s %s %s\n", p->NAME, p->STREET, p->CITY, p->EIP, p->STATE);
q->next = p;
p->next = NULL;
q = p;
}
}
fclose(fp);
}
return h;
}
这是正确的代码
void dami_save(DAMI *head)
{
FILE *fp;
fp = fopen("DAMI_data.txt", "a+");
DAMI *q;
if(fp == NULL)
{
printf("\t\t\t\tError!\n\nFile cannot open!\n\n");
getchar();
}
q = head;
while(q)
{
fprintf(fp, "%s %s %s %s %s\n", q->NAME, q->STREET, q->CITY, q->EIP, q->STATE);
q = q->next;
}
fclose(fp);
}
这个是保存函数
上面是引入阶段哈
写入到txt文档里是长这样的,每行是一个节点的信息存储
在 load函数之后可能会出现读入的函数是乱码的情况,这是因为已经给h(如下图)开辟了空间
如果是空文件的话,那么就对h->data什么也没有赋值,那么直接返回一个空的h回去,h->data自然就是乱码了
所以要先判断是否是空文件,然后再确定要不要给h开辟空间,如果是空文件的话,就不要给h开辟空间了