从二进制文件读取时,循环在中途停止,直到那时一切都很好
When reading from binary file, loop stops midway, all good up till then
我正在尝试将 arr_size 个整数从二进制文件“file.bin”读取到动态数组 到达。文件中的第一个数字是 arr_size 值,可以正确读取。然后循环遍历 arr_size 个值,前 5 个值被正确读取,然后程序突然停止并且 fscanf 之后的 printf 不打印任何内容。没有错误或警告,什么都没有。
这就是我调用函数的方式:
loadFromFile(&size, &m2);
函数本身:
void loadFromFile (int *arr_size, int **arr) {
FILE *file = fopen("file.bin", "rb");
fscanf(file, "%d", arr_size);
(*arr) = (int *) malloc ((*arr_size) * sizeof(int));
for (int i = 0; i < *arr_size; i++) {
printf("i=%d, ", i);
fscanf(file, "%d", arr[i]);
printf("%d \n", *arr[i]);
}
fclose(file);
}
输出是这样的:
i=0, 928
i=1, 604
i=2, 113
i=3, 37
i=4, 193
i=5,
我认为问题出在您的指针访问上:
(*arr) = (int *) malloc ((*arr_size) * sizeof(int));
arr
被假定为指向一个类型为 int*
的变量。这会将 *arr
设置为分配的数组。
fscanf(file, "%d", arr[i]);
这将 arr
视为指针数组,而不是指向数组指针的指针。
printf("%d \n", *arr[i]);
这与上面的scanf()
调用是一致的。但是,它们都越界访问内存,在调用方的 int* arr
变量之后,而不是使用新分配的数组。
您需要对 scanf()
使用 &(*arr)[i]
,对 printf()
使用 (*arr)[i]
。或者实际上使其可读且不易出错,这样写:
int *dest = malloc ((*arr_size) * sizeof(int));
*arr = dest;
fscanf(..., &dest[i]);
printf(..., dest[i]);
我正在尝试将 arr_size 个整数从二进制文件“file.bin”读取到动态数组 到达。文件中的第一个数字是 arr_size 值,可以正确读取。然后循环遍历 arr_size 个值,前 5 个值被正确读取,然后程序突然停止并且 fscanf 之后的 printf 不打印任何内容。没有错误或警告,什么都没有。 这就是我调用函数的方式:
loadFromFile(&size, &m2);
函数本身:
void loadFromFile (int *arr_size, int **arr) {
FILE *file = fopen("file.bin", "rb");
fscanf(file, "%d", arr_size);
(*arr) = (int *) malloc ((*arr_size) * sizeof(int));
for (int i = 0; i < *arr_size; i++) {
printf("i=%d, ", i);
fscanf(file, "%d", arr[i]);
printf("%d \n", *arr[i]);
}
fclose(file);
}
输出是这样的:
i=0, 928
i=1, 604
i=2, 113
i=3, 37
i=4, 193
i=5,
我认为问题出在您的指针访问上:
(*arr) = (int *) malloc ((*arr_size) * sizeof(int));
arr
被假定为指向一个类型为 int*
的变量。这会将 *arr
设置为分配的数组。
fscanf(file, "%d", arr[i]);
这将 arr
视为指针数组,而不是指向数组指针的指针。
printf("%d \n", *arr[i]);
这与上面的scanf()
调用是一致的。但是,它们都越界访问内存,在调用方的 int* arr
变量之后,而不是使用新分配的数组。
您需要对 scanf()
使用 &(*arr)[i]
,对 printf()
使用 (*arr)[i]
。或者实际上使其可读且不易出错,这样写:
int *dest = malloc ((*arr_size) * sizeof(int));
*arr = dest;
fscanf(..., &dest[i]);
printf(..., dest[i]);