C++ access函数判断文件是否存在

最近看到一个函数,第一眼觉得很sb,因为remove的定义在if内部,变成了局部变量,结果如果文件“234.bin”不存在的话,一定会出错的,因为remove的生存期有限。

结果,亮瞎我的眼:

[cpp]  view plain copy
  1. #include<iostream>  
  2. #include "unistd.h"  
  3. #include "stdio.h"  
  4. #include "stdlib.h"  
  5.   
  6. using namespace std;  
  7.   
  8. int main()  
  9. {    
  10.     if(access("234.bin",F_OK))  
  11.     {  
  12.        bool remove=true;  
  13.     }  
  14.   
  15.     if(remove)  
  16.     {  
  17.         cout<<"Need to delete..."<<endl;  
  18.     }  
  19.     return 0;  
  20. }  
结果各种悲剧,无论这个文件是否存在:


事实上,我个人认为这个问题出在这个access函数的返回值上,它的返回值是

0    如果文件是指定的mode

-1   如果出错

所以上述程序,无论是找到文件(0),还是找不到(-1),都是false,所以应该是永远都进不了if(remove)的。。

所以应该是:

[cpp]  view plain copy
  1. if(0 == access("234.bin",F_OK))  
  2. {  
  3. remove = true;  
  4. }  
这么改后,还是没能看到我想要的错误,我想要看到remove不存在的出错啊~~很可惜,依旧是:

原来:

remove是一个已经存在的函数,函数地址不为空,所以一直都能进 if(remove){}

大家,以后判断文件是否存在,用以下的代码比较好:

[cpp]  view plain copy
  1. #include<iostream>  
  2. #include "unistd.h"  
  3. #include "stdio.h"  
  4. #include "stdlib.h"  
  5. using namespace std;  
  6.   
  7. int file_exist(char *file)  
  8. {  
  9.     return (access(file,F_OK) == 0);  
  10. }  
  11. int main()  
  12. {  
  13.     cout<<"Does file exist :"<<(file_exist("234.bin")?"Yes":"No")<<endl;  
  14.     return 0;  
  15. }  
总结:

(一)用access函数注意返回值是 0 和-1,都是false

(二)remove是个函数名,定义命名的时候注意不要用到系统的东东

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值