[问题] 在sub block做fopen并回传问题

楼主: jacky1989   2023-12-05 23:43:09
开发平台(Platform): (Ex: Win10, Linux, ...)
CentOS
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
GCC
问题(Question):
最近写程式时,碰到在sub block做fopen,然后找到指定关键字后回传
我是这样写的
#include<stdlib.h>
#include<stdio.h>
int main(){
int status=-1;
status=sub_test("test");
printf("Status is %d\n",status);
return 0;
}
int sub_test(char *filename){
fid_rd=fopen(filename,"r");
while(fscanf(fid_rd,"%s",&tmp)!=NULL){
if(strcmp("PASS",tmp)==0)
return 1;
}
fclose(fid_rd);
return 0;
}
这边这样写,在编译不会有问题,但是最近总觉得怪,档案还没被关闭就return回主程式
这样真的不会造成内存的浪费吗?有没有人可以教我一下该怎么去观察内存使用状况?
我在想是不是改成以下这种写法比较好?
int status=0;
while(fscanf(fid_rd,"%s",&tmp)!=NULL){
if(strcmp("PASS",tmp)==0){
status=1;
break;
}
}
fclose(fid_rd);
return status;
再麻烦高手解答了,感谢
作者: wulouise (在线上!=在电脑前)   2023-12-05 23:52:00
fd开了就要自己关,如果不持续跑可能就还好
作者: Richun (解放左手的OO之力)   2023-12-06 00:38:00
回传fd的同时,参数多个吃&status的ptr,决策权丢给caller
作者: Lipraxde (Lipraxde)   2023-12-06 09:13:00
最终 process 结束后 OS 会帮你回收只有在你自己这个 process 里面浪费
作者: descent (“雄辩是银,沉默是金”)   2023-12-06 10:12:00
可以先 fopen,改传 FILE*,不要传档名让sub_test()做fopensub_test 做完在 fclose
作者: stupid0319 (征女友)   2023-12-06 21:35:00
老师是不是教你if内只能写一行?我知道问题在哪了fclose(fid_rd);是不是只能出现一次?
作者: yvb   2023-12-07 22:57:00
严格说起来 fopen() 不检查回传值不是也该觉得怪?
作者: CoNsTaR ((const *))   2023-12-08 13:21:00
内存不会浪费吧,file descriptor 会浪费
作者: askacis (ASKA)   2023-12-09 15:55:00
一直重复开档不关的行为,程式跑久了就会吃系统可用的fd系统会一堆灵异现象,直到你用lsof看才发现开了几千个fd
作者: seanwu (海恩)   2023-12-09 23:31:00
你的想法是对的,fxxx系列函数一般的实作应该会有inputbuffer,会占掉heap memory,fclose完才会释放掉
作者: wulouise (在线上!=在电脑前)   2023-12-10 10:41:00
应该会先跳too many open files吧
作者: glo6e (ezdodance)   2023-12-25 22:50:00

Links booklink

Contact Us: admin [ a t ] ucptt.com