读取c中的最后一行时,文件指针更改为NULL

ogq8wdun  于 2023-01-12  发布在  其他
关注(0)|答案(1)|浏览(108)

我有一个二进制文件与5长整型,一切工作如预期,但当我读文件中的最后一项文件指针返回NULL从func2和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;
}
wnavrhmk

wnavrhmk1#

有几个错误:

  • 你正在返回一个需要在堆栈上分配的数组的地址。在此之后使用它会导致未定义的行为。
  • 同样在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;
}

当然,您还希望检查内存分配和打开文件时的错误。

相关问题