我(一如既往)在链接列表中编写和读取时遇到了一些麻烦。
它被保存到二进制文件的事实让我感到困惑。
我尝试编写一个简单的程序,只有一个带有两个变量的简单结构,并将其写入磁盘,只是为了检查我是否误用了fread()
或fwrite()
。但是,我不是。该计划进展顺利。
当我开始将指针和节点添加到链表时,麻烦就开始了。
我已经检查过stackoverflow.com,cplusplus.com,cprograming.com,从我看到的,我的程序没有任何错误。试过调试,什么都没有。编译器根本没有抱怨。
下面包含的源代码非常简单:包含一个带有两个变量的结构,名称和代码,如客户端控件。代码由程序自动给出,用户输入名称。然后程序应该保存数据,然后继续。但是,它没有超过fir->sacode = 1
作业。
任何提示将不胜感激。
#include <stdio.h>
void save(void);
int load(void);
struct solic {
char name[10];
int sacode;
struct solic *next;
};
struct solic *cur, *fir;
int sacode = 1;
int main()
{
if(load() == 0)
printf("Load Successful!\n");
char cho1;
fir->sacode = 1;
cur=fir;
while(1){
cur->sacode = sacode;
printf("Client code is %04d",cur->sacode);
printf("Enter client name: ");
scanf("%s",cur->name);
save();
printf("Saved!\n");
printf("Press '1' to enter another client, or 'Enter' to save and exit.\n");
scanf("%c",&cho1);
if(cho1 == '1')
{
cur->next = (struct solic *)malloc(sizeof(struct solic));
cur = cur->next;
sacode++;
cur->sacode = sacode;
continue;
}
else if(cho1 == '\r');
break;
}
return(0);
}
void save(void)
{
FILE *pFile;
pFile = fopen("db.dat","w");
while(cur != NULL)
{
fwrite(cur->name,sizeof(cur->name),1,pFile);
fwrite(&cur->sacode,sizeof(int),1,pFile);
cur = cur->next;
}
fclose(pFile);
}
int load(void)
{
int size;
char buffer[10];
FILE *pFile;
pFile = fopen("db.dat","r");
if(pFile == NULL)
return(1);
size = fseek(pFile,0,SEEK_END);
rewind(pFile);
cur = fir;
while(size >= ftell(pFile))
{
fread(cur->name,sizeof(cur->name),1,pFile);
fread(buffer,sizeof(int),1,pFile);
cur->sacode = atoi(buffer);
sacode++;
cur->next = (struct solic *)malloc(sizeof(struct solic));
cur = cur->next;
}
cur->next = NULL;
return(0);
}
答案 0 :(得分:2)
首次运行此程序时,load()
将失败,因为没有数据。这意味着fir
将不会被初始化,因此fir->sacode = 1
将尝试更新内存中的某个随机位置。在fir
中存储任何内容之前,您需要使用malloc()
为其分配新节点。
您的save()
函数每次运行时都会写一个新的db.dat
文件,从cur
指针开始。但每次调用时,cur
都指向列表中的最后一个元素。您需要打开此文件以进行追加,因此它不会写入已存在的任何数据,也不会遍历整个列表。