作者jacky1989 ()
看板C_and_CPP
标题[问题] 在sub block做fopen并回传问题
时间Tue Dec 5 23:43:09 2023
开发平台(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;
再麻烦高手解答了,感谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 150.116.208.71 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1701790992.A.67B.html
1F:推 wulouise: fd开了就要自己关,如果不持续跑可能就还好 12/05 23:52
2F:推 Richun: 回传fd的同时,参数多个吃&status的ptr,决策权丢给caller 12/06 00:38
3F:→ Lipraxde: 最终 process 结束後 OS 会帮你回收 12/06 09:13
4F:→ Lipraxde: 只有在你自己这个 process 里面浪费 12/06 09:13
5F:推 descent: 可以先 fopen,改传 FILE*,不要传档名让sub_test()做fopen 12/06 10:12
6F:→ descent: sub_test 做完在 fclose 12/06 10:12
7F:→ stupid0319: 老师是不是教你if内只能写一行? 12/06 21:35
8F:推 stupid0319: 我知道问题在哪了fclose(fid_rd);是不是只能出现一次? 12/06 21:39
9F:推 yvb: 严格说起来 fopen() 不检查回传值不是也该觉得怪? 12/07 22:57
10F:推 CoNsTaR: 记忆体不会浪费吧,file descriptor 会浪费 12/08 13:21
11F:推 askacis: 一直重复开档不关的行为,程式跑久了就会吃系统可用的fd 12/09 15:55
12F:→ askacis: 系统会一堆灵异现象,直到你用lsof看才发现开了几千个fd 12/09 15:56
13F:推 seanwu: 你的想法是对的,fxxx系列函数一般的实作应该会有input 12/09 23:31
14F:→ seanwu: buffer,会占掉heap memory,fclose完才会释放掉 12/09 23:31
15F:推 wulouise: 应该会先跳too many open files吧 12/10 10:41
16F:→ glo6e: 推 12/25 22:50