两次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

函数原型:FILE * fopen(const char * path,const char * mode);
返回值:文件顺利打开后,向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。
一般而言,打开文件后会做一些文件读取或写入的动作,若打开文件失败,接下来的读写动作也无法顺利进行,所以一般在fopen()后作错误判断及处理。

以上是关于两次fopen结果不同,怎么判断文件指针冲突?的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 核心文件上调用 fopen 返回 NULL 指针

PHP中fopen函数的问题

c语言fopen函数 fp=fopen(" /","r") fopen 函数怎么样打开url 文件 比如 http://10.4.64.

fopen

C语言 结构体指针字符 二进制文件写入和读取

c语言fopen怎么用