拯救和从二进制列表中读取?

时间:2013-05-27 15:10:57

标签: c file binary save

你能告诉我我做错了吗......为什么它不能正常工作?

这是我的二进制保存文件:

int SaveToBinary(FILE *fp,struct node *kvartiras){
    int l;
    struct node *tmp=NULL;

    for(tmp=kvartiras; tmp; tmp = tmp->next){
        l=fwrite(&(tmp->s),1,sizeof(Kvartira),fp);
        if (l != (sizeof(Kvartira))) { 
            printf("\nгрешка - неуспешно записване на данните !");
            return 1;
        }
    }
    system("cls");
    return 0;

}

从二进制文件中读取:

struct node * ReadBinary(FILE *fp,struct node *kvartiras){
    struct node *tmp=NULL;
    struct node *tmp2=NULL;
    int l;
    if((kvartiras) && (kvartiras->next)) {
        *tmp = *kvartiras;
        *tmp2 = *kvartiras->next;
    }
    while(tmp2) {
        free(tmp);
        tmp=tmp2;
        tmp2 = tmp2->next;
    }


    rewind(fp);
    while(!feof(fp))
    { 
        tmp=(struct node*) malloc(sizeof(struct node));
        if(!tmp){
            printf("\nГрешка при заделяне на паметта !\n");
            return kvartiras; 
        }
        l=fread(&(tmp->s),1,sizeof(Kvartira),fp);
        if (l != (sizeof(Kvartira))) 
        {
            free(tmp);
            return kvartiras;
        }
        tmp->next=kvartiras;
        kvartiras=tmp;
    }
    return kvartiras;
}

这是我使用的案例:

        case 6:
            if(kvartiras){ 
                for(i=0;i<256;i++) check[i]='\0';
                fflush(stdin);
                printf("\nВъведете име на файл:");
                scanf_s("%s",check);
                fp_out= fopen(check,"wb");
                if(fp_out)
                {
                    if(!(SaveToBinary(fp_out,kvartiras))){
                    //-- извикване на ф-я за запис на данните в двоичен файл --
                        printf("\nданните са записани във файл <%s> успешно !",check);
                        if(fp_out) fclose(fp_out);
                    }
                }else printf("\nгрешка - неуспешно създаване на файла !");
            }else printf("\nгрешка - базата данни е празна !");
            break;
        case 7: 
            for(i=0;i<256;i++) check[i]='\0';
            fflush(stdin);
            printf("\nВъведете име на файл:");
            scanf_s("%s",check);
            fp_in=fopen(check,"rb");
            if(fp_in){
                kvartiras=ReadBinary(fp_in,kvartiras);
                //-- извикване на ф-я за прочитане на данни от двоичен файл --
                if(kvartiras) printf("\nданните са прочетени успешно !");
                if(fp_in) fclose(fp_in);
            }else printf("\nгрешка - неуспешно създаване на файла !");
            break; 
        }
    }while (mode != 8 );
    return 0;
}

结构:

typedef struct {
    int kod;
    char adres[51];
    int plo6t;
    int stai;
    int naem;
} Kvartira;

struct node {
    Kvartira s;
    struct node *next;
};

1 个答案:

答案 0 :(得分:0)

可能有一个错误:

 if (l != (sizeof(Kvartira))) 

这将永远是真的,sizeof(Kvartira)至少是sizeof(int)* 4 + 51。