两次fopen结果不同,怎么判断文件指针冲突?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两次fopen结果不同,怎么判断文件指针冲突?相关的知识,希望对你有一定的参考价值。
FILE * fp1=0,* fp2=0;
printf("fp1=0x%X fp2=0x%X\n",fp1,fp2);
fp1=fopen("2","rb");
printf("fp1=0x%X fp2=0x%X\n",fp1,fp2);
fp2=fopen("2","rb");
printf("fp1=0x%X fp2=0x%X\n",fp1,fp2);
这段代码的结果是:
fp1=0x0 fp2=0x0
fp1=0x40F0C8 fp2=0x0
fp1=0x40F0C8 fp2=0x40F0E8
我要怎么判断fp1,fp2指向同一个文件?
因为我用串打开文件,一个读一个写,怕串相同时打开fp2覆盖了fp1的文件.想靠指针判断,很急,知道的拉一把,谢了.
不想判断串相同,路径串里还要排除\/的不同串同义.
下面那位pgt,我的示例用的是相对路径,2是完整的文件名.
我的str1和str2都是代表文件路径(包括文件名)的字符串(可以有空格,可以含中文,大小写同义,正反斜杠同义),我要把一个不限类型和大小的文件(例如电影)重新编码(压缩或加密或解码)存到另一个新建的文件(如果已存在,则fopen()会删掉重建,str1与str2同义的话就会丢失所有数据),所以想再只读打开来试探是否同义.
看了RYW的回答,觉得STDIO.H好像不容易解决问题了.
反正兄弟我作业已经交了,干脆只要fp2=fopen(s,"r")打开成功,就提示是否删除,确认了再fclose(fp2);fp2=fopen(s,"w");这样就是用户自己要求删的了.
楼主代码完全是正确的,但用两个文件指针指向同一个文件,实际上是没有意义的.如果是同时读的话,用fopen获得两个文件指针是可行的,因为磁盘上的内容不发生变化,两个文件指针可以独立的不干涉的操作。但是请注意楼主的意图,她需要一个读一个写,这才是问题的关键,在这种情况下,除了引入临时文件外,其他解决方案的结果都是没有明确定义的,依赖于程序运行逻辑和系统运行状况而异。
你说的怎么判断fp1,fp2指向同一个文件,可以用fstat()来完成。
include <sys\\stat.h>
struct stat
short st_dev;
short st_ino;
short st_mode;
short st_nlink;
int st_uid;
int st_gid;
short st_rdev;
long st_size;
long st_atime;
long st_mtime;
long st_ctime;
;
int _Cdecl fstat (int __handle, struct stat *__statbuf);
取得struct stat *__statbuf后,你可比较两__handle相应的项,但一般只要比较
short st_dev;
short st_ino;这两项就可以了,
如要完整验证代码或还有不理解处,可以加我QQ898114195,问题解决后但请别忘了给分哦
参考技术A 有一个函数可以在打开文件的同时,关闭另一个文件流:freopen(打开文件)
相关函数
fopen,fclose
表头文件
#include<stdio.h>
定义函数
FILE * freopen(const char * path,const char * mode,FILE * stream);
函数说明
参数path字符串包含欲打开的文件路径及文件名,参数mode请参考fopen()说明。参数stream为已打开的文件指针。Freopen()会将原stream所打开的文件流关闭,然后打开参数path的文件。
返回值
文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno 中。
范例
#include<stdio.h>
main()
FILE * fp;
fp=fopen(“/etc/passwd”,”r”);
fp=freopen(“/etc/group”,”r”,fp);
fclose(fp);
参考技术B 如果在linux下面,你可以给文件加锁,windows下面我不熟悉,但是至少你可以给每个文件设置一个标志位,打开了就置1,关闭了就置0,每次打开文件之前都判断一下标志位就OK了。 参考技术C 你可以使用CreateFile函数,设置共享读方式,这样如果一个读一个写,那么在关闭文件之前只可能成功打开一个文件句柄 参考技术D fp1=fopen("2","rb");
改为:fp1=fopen("c:\\2.*","rb");这样的形式
fopen
以上是关于两次fopen结果不同,怎么判断文件指针冲突?的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 核心文件上调用 fopen 返回 NULL 指针
c语言fopen函数 fp=fopen(" /","r") fopen 函数怎么样打开url 文件 比如 http://10.4.64.