作者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/m.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