我对“fopen”功能有疑问。
FILE *pFile1, *pFile2;
pFile1 = fopen(fileName,"rb+");
pFile2 = fopen(fileName,"rb+");
我可以说pFile1 == pFile2吗?此外,FILE类型可以用作地图的键吗?
谢谢!
答案 0 :(得分:5)
我可以说
pFile1 == pFile2
吗?
否pFile1
和pFile2
是指向两个不同函数调用返回的两个不同 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)
(阅读Grijesh Chauhan的相关评论后编辑)
你可以说pFile1!= pFile2,因为有两件事可能发生:
顺便说一句,这是成千上万检查系统调用的另一个原因。
假设第二次调用成功,例如,当你用pFile2读取另一个时,你可以用pFile1寻找一个给定的位置。
作为旁注,由于您最终将访问同一个物理磁盘,因此除非您确切知道自己在做什么,否则很难这样做。在大文件的两个不同部分之间来回寻找疯狂可能最终迫使磁盘驱动程序在磁盘的两个物理部分之间摇摆,从而显着降低I / O性能(除非磁盘是非寻求的设备,如SSD )。
不,因为
你可以使用FILE *
,因为任何指针都可以用作地图键。
然而,这样做非常危险。首先,指针就像一个随机数给你。它来自sdtio库中的一些内存分配,你无法控制它。
第二,如果由于某种原因你取消分配文件句柄(即你关闭文件),你将继续使用无效的指针引用作为键,除非你也从地图中删除文件。这是可行的,但尴尬和危险的恕我直言。