编写和阅读链接列表

时间:2013-12-12 15:19:47

标签: c pointers linked-list fwrite fread

我(一如既往)在链接列表中编写和读取时遇到了一些麻烦。 它被保存到二进制文件的事实让我感到困惑。 我尝试编写一个简单的程序,只有一个带有两个变量的简单结构,并将其写入磁盘,只是为了检查我是否误用了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);
}

1 个答案:

答案 0 :(得分:2)

  1. 首次运行此程序时,load()将失败,因为没有数据。这意味着fir将不会被初始化,因此fir->sacode = 1将尝试更新内存中的某个随机位置。在fir中存储任何内容之前,您需要使用malloc()为其分配新节点。

  2. 您的save()函数每次运行时都会写一个新的db.dat文件,从cur指针开始。但每次调用时,cur都指向列表中的最后一个元素。您需要打开此文件以进行追加,因此它不会写入已存在的任何数据,也不会遍历整个列表。