在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结构之外的其他一些必要的文件数据?
答案 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填充有关该文件的信息,但它不包含在文件本身中。