因此我在C语言中具有此功能,可以将数据从二进制文件读取到动态数组。当我运行它时,它崩溃了,我试图放一些printf来知道它被卡在哪里,并且好像是在我尝试进行重新分配时。 我只是找不到任何错误。希望有人能帮助我。
tipoEmprestimo *lerFichBin_Emprestimos(tipoEmprestimo *vetorEmprestimos,int *quantEmprestimos)
{
int quantlidos;
FILE *ficheiro;
ficheiro=fopen("emprestimos.dat","rb");
if (ficheiro == NULL)
{
printf("\nNao foi possivel ler o ficheiro!");
free(vetorEmprestimos);
vetorEmprestimos=NULL;
*quantEmprestimos=0;
}
else
{
quantlidos=fread(&quantEmprestimos,sizeof(int),1,ficheiro);
if (quantlidos != 1)
{
printf("\nErro ao ler ficheiro!");
}
vetorEmprestimos=realloc(vetorEmprestimos,(*quantEmprestimos)*sizeof(tipoEmprestimo));
if (vetorEmprestimos == NULL)
{
printf("\nErro ao reservar memoria!");
}
else
{
quantlidos=fread(vetorEmprestimos,sizeof(tipoEmprestimo),*quantEmprestimos,ficheiro);
if(quantlidos != *quantEmprestimos)
{
printf("\nErro ao ler ficheiro!");
}
}
}
fclose(ficheiro);
return vetorEmprestimos;
}
答案 0 :(得分:2)
可能的原因
答案 1 :(得分:2)
我找不到任何错误
节省时间,让编译器为您提供帮助。
完全启用的优秀编译器会抱怨各种各样的事情:
In function 'lerFichBin_Emprestimos':
warning: conversion to 'int' from 'size_t {aka long unsigned int}' may alter its value [-Wconversion]
quantlidos = fread(&quantEmprestimos, sizeof(int), 1, ficheiro);
^~~~~
warning: conversion to 'long unsigned int' from 'int' may change the sign of the result [-Wsign-conversion]
(*quantEmprestimos) * sizeof(tipoEmprestimo));
^
warning: conversion to 'size_t {aka long unsigned int}' from 'int' may change the sign of the result [-Wsign-conversion]
*quantEmprestimos, ficheiro);
^
warning: conversion to 'int' from 'size_t {aka long unsigned int}' may alter its value [-Wconversion]
quantlidos = fread(vetorEmprestimos, sizeof(tipoEmprestimo),
^~~~~
Finished building: ../round.c
解决上述问题可能/可能无法解决您的问题,但这表明在转向Stackoverflow之前首先采用了良好的编码惯例。
以下内容正在尝试读取指针而不是int
。这是一个巨大的编码错误。
int *quantEmprestimos
...
... fread(&quantEmprestimos, ...
某些代码应该读取int
。
// v--------No &
... fread( quantEmprestimos, ...
避免使用显式类型
而不是代码类型,可能会弄错-与OP一样,使用被引用对象的大小。
// points to an `int *`, mis-matched size
// quantlidos=fread(&quantEmprestimos, sizeof(int),1,ficheiro);
// matched size
quantlidos = fread(quantEmprestimos, sizeof *quantEmprestimos, 1, ficheiro);
重新考虑错误处理
fread()
是否不返回1,quantEmprestimos
中使用的realloc()
的值是什么?出错时,代码仍使用quantEmprestimos
。 stdio
通常是行缓冲的,因此缺少错误消息并不表示成功。使用 stderr 进行错误输出,因为每次写入时都会刷新它。
quantEmprestimos
尚未初始化-可以是任何东西!
// OP's code with problems
quantlidos = fread(&quantEmprestimos, sizeof(int), 1, ficheiro);
if (quantlidos != 1) {
printf("\nErro ao ler ficheiro!");
}
vetorEmprestimos = realloc(vetorEmprestimos, (*quantEmprestimos) * sizeof(tipoEmprestimo));
替代代码
quantlidos = fread(quantEmprestimos, sizeof *quantEmprestimos, 1, ficheiro);
if (quantlidos != 1) {
// printf("\nErro ao ler ficheiro!");
fprintf(stderr, "\nErro ao ler ficheiro!");
exit(EXIT_FAILURE); // or do something other than continue on.
}
vetorEmprestimos = realloc(vetorEmprestimos, sizeof *vetorEmprestimos * *quantEmprestimos);