在二进制文件中保存内存分配指针矩阵

时间:2015-01-01 20:03:33

标签: c pointers malloc binaryfiles

我有一个库的数据库,其中包含有关书籍的信息,我需要为它动态分配空间,读取用户输入,将其保存在二进制文件中并退回。我成功保存了qtd变量,但是当我尝试使用所有内容保存到文件时程序崩溃。编译器在livraria.exe中给出了错误“0x0f6fc9c7(msvcr100d.dll)的未处理异常:0xC0000005:访问冲突读取位置0x000000cc。” 。

    struct livro {
    char titulo [100];//title
    char autor [100];//writer
    float prec;//price
    };

struct livro * cadastro (int *qtd){ //function for user registration of the data
int i;
struct livro *Livros=NULL;


qtdcad:
printf("Insira a quantidade de livros:");
scanf ("\n%i", qtd); //gets quantity of books


if((*qtd>1000)||(*qtd<1)){ //limit the quantity to a value
    goto qtdcad;
printf("quantidade invalida");
}

Livros = malloc( *qtd *sizeof(struct livro)); //allocate memory based on 'qtd'

printf ("insira os dados de cada livro:");

    for (i=0;i<*qtd;i=i+1){
        getchar();
    printf ("\n\n\ninsira o titulo:");
    fgets (Livros[i].titulo,100, stdin); //gets the title


    printf ("\ninsira o nome:");
   fgets (Livros[i].autor,100, stdin);//gets the writer


    printf ("\ninsira o preco :");
    scanf (" %f",&Livros[i].prec,100, stdin);//gets the price


    }
return Livros;
}

    void salvar (int qtd, struct livro *Livros){//function to save
        int i, checkwrt;
        FILE *fp;
    fp= fopen ("Livros_save", "wb" );

    Livros=NULL;
    if ( NULL ==fp){ 
        printf ( "O arquivo não pode ser aberto.\n" );
        return;
    }

    checkwrt=fwrite (&qtd, sizeof(int), 1, fp); //saves the 'qtd' variable in the file to be able later to allocate the correct size for the database 

                if (checkwrt!=1) {
                     printf("erro na escrita\n");
                }

        for(i=0;i,qtd;i=i+1){ //loop to save the lines
            if(Livros[i].titulo){
            checkwrt = fwrite (&Livros[i], sizeof(struct livro), qtd, fp);
                if (checkwrt!=1) {
                printf("erro na escrita\n");
                }
            }
        }

    fclose(fp);
    }

struct livro *recuperar (int *qtd, struct livro *Livros){//function to retreat the data
    int i, checkwrt;
    FILE *fp;
Livros=NULL;
fp= fopen ("Livros_save", "rb" );


    if ( NULL ==fp)
    { 
    printf ( "O arquivo não pode ser aberto.\n" );
    return NULL;
    }

    checkwrt = fread(qtd, sizeof(int),1,fp); //reads 'qtd'in the file and pass it to the variable
            if(checkwrt!=1){
            printf("erro na escrita\n");
            }



    for(i=0;i<*qtd;i=i+1){
        if(Livros[i].titulo){
        checkwrt=fread(&Livros[i], sizeof(struct livro),*qtd,fp); //reads the lines and pass it to the matrix
            if(checkwrt!=1){
                if ( feof (fp) ){
                    break;
                }
            printf("erro na escrita\n");
            }
        }

0 个答案:

没有答案