2013-12-12 85 views
0

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

回答

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

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

+0

@rrrty谢谢你的答案!所以在理论上,可以用''fir =(struct solic *)malloc(sizeof(struct solic));''将节点分配给'fir''来解决,对吗? 2.这可以通过将'cur''分配给''fir''来解决,然后在列表中循环。 –

+0

准确。请注意,在这里传递'malloc()'的返回值是非常不受欢迎的,所以我建议你使用'fir = malloc(sizeof(struct solic))',以避免被争论的人争执。 :-) –