FILE结构分配在哪里?

时间:2012-01-10 22:31:02

标签: c file-io

在C中,用

打开文件时
FILE *fin; 
fin=fopen("file.bin","rb"); 

我只有一个指向FILE结构的指针。在Windows机器上分配的实际FILE结构在哪里?它是否包含访问文件的所有必要信息?

我的目标是将整个数据段转储到磁盘,然后将转储的文件重新加载回数据段的开头。重新加载转储文件的代码放在一个单独的函数中。这样,fin指针是本地的并且在堆栈中,因此在重新加载时不会被覆盖。但FILE结构本身不是本地的。我注意不要覆盖从地址sizeof(FILE)开始的大小为fin的内存区域。

fread(DataSegStart,1,szTillFin,fin);
fread(dummy,1,sizeof(FILE),fin);
fread(DataSegAfterFin,1,szFinTillEnd,fin);

操作成功完成,但我在

上遇到断言失败
fclose(fin)

我是否会覆盖除FILE结构之外的其他一些必要的文件数据?

4 个答案:

答案 0 :(得分:3)

FILE结构的实际实例存在于标准库中。通常,标准库分配一些FILE结构,这些结构可能是也可能不是固定数量的FILE结构。当您调用fopen()时,它会返回指向其中一个结构的指针。

FILE结构中的数据可能包含指向缓冲区等其他内容的指针。如果没有与标准库实现的深度集成,您就不可能将这些结构保存并恢复到磁盘。

您可能对CryoPID之类的内容感兴趣,它会在不同级别处理保存和恢复。

答案 1 :(得分:2)

似乎你正在尝试做一些危险的事情,不太可能奏效。

fopen分配FILE结构并对其进行初始化。 fclose发布它。它如何分配它以及它所包含的内容取决于实现。它可能包含一个指向另一块内存的指针,它也被分配到某处(因为它是缓冲的I / O,我想它确实在某处分配了一个缓冲区)。

编写依赖于fopen内部的代码是危险的,很可能不会起作用,而且肯定不会稳定和便携。

答案 2 :(得分:1)

嗯,你有一个指向FILE对象的指针,所以从技术上讲,你知道它在哪里,但你应该知道FILE故意是一个不透明的类型。您不应该知道它包含什么,您只需要知道您可以将它传递给知道它的函数来执行某些操作。此外,FILE可能不是完整类型,因此sizeof(FILE)可能不正确,此外,对象可能包含指向其他结构的指针。简单地避免覆盖FILE对象可能不足以避免通过写入大部分内存来破坏程序。

答案 3 :(得分:0)

FILE在stdio.h中定义。它包含有关该文件的所有信息,但是,查看您显示的代码,我认为您不了解其目的。它是使用C库在操作系统中创建和运行的,该库为FILE填充有关该文件的信息,但它不包含在文件本身中。