我(一如既往)在写入和读取链接列表时遇到了一些麻烦。 它被保存到二进制文件的事实使我困惑。 我试图编写一个简单的程序,只有一个简单的结构与两个变量,并写入并读取到磁盘,只是为了检查我是否滥用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);
}
@rrrty谢谢你的答案!所以在理论上,可以用''fir =(struct solic *)malloc(sizeof(struct solic));''将节点分配给'fir''来解决,对吗? 2.这可以通过将'cur''分配给''fir''来解决,然后在列表中循环。 –
准确。请注意,在这里传递'malloc()'的返回值是非常不受欢迎的,所以我建议你使用'fir = malloc(sizeof(struct solic))',以避免被争论的人争执。 :-) –