使用fopen在C中重复打开文件

时间:2014-01-25 04:49:19

标签: c fopen

我对“fopen”功能有疑问。

FILE *pFile1, *pFile2;
pFile1 = fopen(fileName,"rb+");
pFile2 = fopen(fileName,"rb+");

我可以说pFile1 == pFile2吗?此外,FILE类型可以用作地图的键吗?

谢谢!

2 个答案:

答案 0 :(得分:5)

  

我可以说pFile1 == pFile2吗?

pFile1pFile2是指向两个不同函数调用返回的两个不同 FILE结构的指针。

试一试!!

进一步补充:

注意打开已经打开的文件具有实现定义的行为,根据C标准:

  

FIO31-C. Do not open a file that is already open

     

第7.21.3条第8款[ISO / IEC 9899:2011]:

     

打开附加(非临时)文件的功能需要一个文件   name,这是一个字符串。撰写有效文件名的规则是   实施德网络定义。是否可以同时使用同一个文件   多次打开也是实现定义的。

某些平台可能会禁止同时多次打开文件,但其他平台可能会允许它。因此,可移植代码不能取决于违反此规则会发生什么。虽然这在POSIX兼容系统上不是问题。许多应用程序多次打开文件以同时读取(当然,如果您想要编写操作,那么您可能需要并发控制机制,但这是另一回事)。

答案 1 :(得分:4)

我可以说pFile1 == pFile2吗?

(阅读Grijesh Chauhan的相关评论后编辑)

你可以说pFile1!= pFile2,因为有两件事可能发生:

  1. 系统禁止打开文件两次,在这种情况下pFile2将为NULL
  2. 系统允许第二次打开,i,pFile2将指向不同的上下文。
  3. 顺便说一句,这是成千上万检查系统调用的另一个原因。

    假设第二次调用成功,例如,当你用pFile2读取另一个时,你可以用pFile1寻找一个给定的位置。

    作为旁注,由于您最终将访问同一个物理磁盘,因此除非您确切知道自己在做什么,否则很难这样做。在大文件的两个不同部分之间来回寻找疯狂可能最终迫使磁盘驱动程序在磁盘的两个物理部分之间摇摆,从而显着降低I / O性能(除非磁盘是非寻求的设备,如SSD )。

    可以将FILE类型用作地图的键吗?

    不,因为

    1. 使用未知大小的未知结构是没有任何意义的,这种结构的生命周期没有直接控制作为关键
    2. FILE类未实现必要的比较运算符
    3. 可以使用FILE *,因为任何指针都可以用作地图键。

      然而,这样做非常危险。首先,指针就像一个随机数给你。它来自sdtio库中的一些内存分配,你无法控制它。

      第二,如果由于某种原因你取消分配文件句柄(即你关闭文件),你将继续使用无效的指针引用作为键,除非你也从地图中删除文件。这是可行的,但尴尬和危险的恕我直言。