我有一个库的数据库,其中包含有关书籍的信息,我需要为它动态分配空间,读取用户输入,将其保存在二进制文件中并退回。我成功保存了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");
}
}