提问人:NoamiA 提问时间:1/9/2023 最后编辑:ChrisNoamiA 更新时间:1/9/2023 访问量:96
当 c 中的最后一行 fread 时,文件指针更改为 NULL
file pointer is changing to NULL when fread last line in c
问:
我有一个带有 5 个长 int 的二进制文件,一切都按预期工作,但是当我读取文件中的最后一项时,文件指针从 func2 返回 NULL,int 的 func2 文件指针的末尾仍然不为 null,但是当我回到 func1 时,我看到它变成了 naull,你能帮我理解为什么吗? 这是 2 个功能:
long int * func1(char * filename, int numOflogInts)
{
long int numbers[5];
FILE* fp = fopen(filename,"rb");
for (int i = 0; i < numOflogInts; i++) {
numbers[i] = func2(fp, i);
}
return numbers;
fclose(fp);
}
long int func2(FILE * fp, int place)
{
long int num;
fseek(fp, sizeof(long int) * place, SEEK_SET);//skip to the place
fread(&num, sizeof(long int), 1, fp);
return num;
}
答:
1赞
Chris
1/9/2023
#1
几个错误:
- 您将返回需要在堆栈上分配的数组的地址。在此之后使用它会导致未定义的行为。
- 此外,您返回了文件,然后关闭了文件指针。但是由于返回,这个电话是无法接通的。
func1
fclose
- 你有一个常量,而不是用来确定数组的大小。你的循环表明这不是正确的做法。
5
numOflogInts
要解决第一个问题,请动态分配阵列。要修复第二个问题,请在返回之前关闭文件。
long int * func1(char * filename, int numOflogInts)
{
long int *numbers = malloc(sizeof(long int) * numOflogInts);
FILE* fp = fopen(filename,"rb");
for (int i = 0; i < numOflogInts; i++) {
numbers[i] = func2(fp, i);
}
fclose(fp);
return numbers;
}
当然,您还需要检查内存分配和打开文件时是否存在错误。
下一个:C++ : 取消引用空指针警告
评论
numbers
fclose(fp)
return
fp
numOflogInts
numOflogInts
numbers[i] = func2(...
numbers
fp