免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9408 | 回复: 14

[C] 如何判断一个FILE* 指针是否有效 [复制链接]

论坛徽章:
0
发表于 2008-12-19 17:53 |显示全部楼层
10可用积分
例如,我有一个函数,f(FILE* pf)
我想在函数开始的时候判断这个pf是否有效,除了pf!=NULL以外,如果pf指向一个无效的或者是已经关闭了的文件指针,我如何判断呢?

运行环境solaris+gcc

谢谢!

最佳答案

查看完整内容

fstat(fileno(FILE))

论坛徽章:
0
发表于 2008-12-19 17:53 |显示全部楼层
fstat(fileno(FILE))

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
发表于 2008-12-19 17:55 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2008-12-19 17:55 |显示全部楼层
不用判断,让调用你的人保证

论坛徽章:
0
发表于 2008-12-19 17:58 |显示全部楼层
原帖由 jeanlove 于 2008-12-19 17:53 发表
例如,我有一个函数,f(FILE* pf)
我想在函数开始的时候判断这个pf是否有效,除了pf!=NULL以外,如果pf指向一个无效的或者是已经关闭了的文件指针,我如何判断呢?

运行环境solaris+gcc

谢谢!

判断指针是否有效,或指向空间的大小,适用于debug / assert.

1 有些memory manager提供ANSI以外的接口。如Window _CrtIsValidPointer() / _msize(), Linux RH distribution malloc_usable_size()

2 系统Virtual Memory Manger可选择输出进程的address map。如Window VirtualQuery(), Linux /proc/pid/map

http://bbs.chinaunix.net/archiver/?tid-1062779.html

论坛徽章:
0
发表于 2008-12-19 18:10 |显示全部楼层
事实上,如果fp不等于空,你无法判断它指的值是否是有效值。。。。
不过或许你可以试试这个办法,用fileno来返回一个文件描述符,如果能成功,那么fp肯定是有效的,如果出错,那就去判断errno

[ 本帖最后由 alexhappy 于 2008-12-19 18:14 编辑 ]

论坛徽章:
0
发表于 2008-12-19 18:11 |显示全部楼层
原帖由 ziggler 于 2008-12-19 17:58 发表

判断指针是否有效,或指向空间的大小,适用于debug / assert.

1 有些memory manager提供ANSI以外的接口。如Window _CrtIsValidPointer() / _msize(), Linux RH distribution malloc_usable_size()

2 系 ...

谢谢,但是我是想判断FILE*的有效性,上面一位dx提供的ferror函数似乎没有解决问题,如下:
> vi f.c
"f.c" 17 lines, 281 characters
#include<stdio.h>
#include<stdlib.h>
int main(){
int ret;
FILE* pf,*pfx;
pfx=(FILE*)0x000033;
pf=fopen("f.c","r");
if(pf==NULL){
  printf("fopen fail\n");
  exit(1);
}
fclose(pf);
ret=ferror(pf);
printf("ferror returns %d\n",ret);
printf("ferror abc return %d\n",ferror(pfx));
return 0;
}

在fclose()之后,ferror并不会检查出pf的错误,虽然此时pf对应的文件已经关闭了。
而后一个ferror输入参数是一个无效指针,程序直接Segmentation fault了。运行结果
> ./a.out
ferror returns 0
Segmentation fault (core dumped)


该怎么办呢?

论坛徽章:
0
发表于 2008-12-19 18:14 |显示全部楼层
不应当这么做

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
发表于 2008-12-19 18:18 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2008-12-19 18:25 |显示全部楼层
原帖由 alexhappy 于 2008-12-19 18:10 发表
事实上,如果fp不等于空,你无法判断它指的值是否是有效值。。。。
不过或许你可以试试这个办法,用fileno来返回一个文件描述符,如果能成功,那么fp肯定是有效的,如果出错,那就去判断errno

试了,我把程序改成了
#include<stdio.h>
#include<stdlib.h>
int main(){
int ret;
FILE* pf,*pfx;
pfx=(FILE*)0x000033;
pf=fopen("f.c","r");
if(pf==NULL){
  printf("fopen fail\n");
  exit(1);
}
ret=fileno(pf);
printf("before close,fileno=%d\n",ret);
fclose(pf);
ret=fileno(pf);
printf("after close,fileno=%d\n",ret);

ret=fileno(pfx);
printf("fileno=%d\n",ret);
...
输出
> ./a.out
before close,fileno=3
after close,fileno=3
Segmentation fault (core dumped)

不行,fileno不能判断pf是否被fclose()了。谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP