[問題] 如果 feof()==1 還需要fclose嗎?(已補碼)

看板C_and_CPP (C/C++)作者 (800IM)時間9年前 (2016/10/04 11:37), 9年前編輯推噓4(4017)
留言21則, 10人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Linux, 但是這個問題應該不分平台吧? 我這邊在 0!=feof() 的時候 fclose 都會發生Segment fault 類似狀況到stackoverflow上去找解答,都是說: 1.因為重複fclose 2.fopen根本就沒有成功 但是我檢查過沒有上述兩點,所以懷疑是不是已經到檔案結尾時,就不用fclose? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.227.205.43 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1475552253.A.F59.html

10/04 11:39, , 1F
你要不要 fseek 回去再 close 一次試試看
10/04 11:39, 1F
fclose 之前加上 fseek(fptrMD5List, 0, SEEK_SET); 還是沒用

10/04 11:44, , 2F
應該是有別的地方寫錯,比如說 FILE stream 內容不正確
10/04 11:44, 2F

10/04 12:07, , 3F
feof(裡面有東西嗎)
10/04 12:07, 3F

10/04 12:49, , 4F
不fclose()要怎麼釋放fopen()所配置的FILE*資源?
10/04 12:49, 4F

10/04 13:55, , 5F
fclose後給NULL 用NULL判斷要不要fclose
10/04 13:55, 5F

10/04 14:12, , 6F
貼完整程式碼看看
10/04 14:12, 6F

10/04 15:00, , 7F
開檔確定有成功嗎?
10/04 15:00, 7F

10/04 17:40, , 8F
程式碼貼上來看看,不是每個人都有水晶球的。
10/04 17:40, 8F
//打開檔案路徑與MD5清單 FILE* fptrMD5List = fopen(strMD5List,"r"); if(NULL == fptrMD5List) { printf("%s open failed !\n",(char*)fptrMD5List); exit(1); } //逐檔驗證 while(NULL != fgets(strStream, 256, fptrMD5List)) { //strsep會截走定位點之前的字串 strFilePath = strsep(&strStream,"\t");//截出檔案路徑 strFileMD5 = strsep(&strStream,"\n");//截出該檔案MD5 printf("Target File: %s\n",strFilePath); //這邊都有印出資訊 //回圈內都沒動到 fptrMD5List } printf("fptrMD5List=%p\n",fptrMD5List); if(NULL != fptrMD5List) { fclose(fptrMD5List); //Segmentation fault (core dumped) } ※ 編輯: deo2000 (125.227.205.43), 10/04/2016 18:46:30 ※ 編輯: deo2000 (125.227.205.43), 10/04/2016 18:52:49

10/04 18:53, , 9F
請貼完整的程式碼,錯誤出在你沒貼出來的地方
10/04 18:53, 9F

10/04 18:54, , 10F
或是檢查一下 fopen 成功時的 fptrMD5List 和 fclose 時
10/04 18:54, 10F
※ 編輯: deo2000 (125.227.205.43), 10/04/2016 18:55:20

10/04 18:54, , 11F
其指標值是否一樣,或是已經發生原本不該發生的變動
10/04 18:54, 11F

10/04 18:56, , 12F
然後 strsep 處理那邊我怎麼看都覺得很危險
10/04 18:56, 12F

10/04 18:57, , 13F
你應該檢查 strFilePath 和 strFileMD5 的值是否為 NULL
10/04 18:57, 13F

10/04 19:03, , 14F
&strStream?
10/04 19:03, 14F
感謝, 做完 strsep 以後重新配置 strStream 就好了 printf前面加上這行 strStream = (char*)malloc(256); ※ 編輯: deo2000 (125.227.205.43), 10/04/2016 19:05:28

10/04 19:04, , 15F
嗯,&strStream 那邊也是錯的
10/04 19:04, 15F

10/04 19:07, , 16F
八成哪邊有非法存取 把stack弄爛了
10/04 19:07, 16F

10/04 19:08, , 17F
這種bug不一定出在seg fault的那個變數,要看整個區塊
10/04 19:08, 17F

10/04 19:17, , 18F
建議你把 strsep 的 man page 重看一次,strsep 的
10/04 19:17, 18F

10/04 19:18, , 19F
第一個參數型態比較特別,但宣告你沒寫出來
10/04 19:18, 19F

10/04 19:19, , 20F
照你這個動態配置法基本上到時候 free 時也是會出槌
10/04 19:19, 20F

10/04 19:20, , 21F
因為 strStream 的值會被 strsep 改動
10/04 19:20, 21F
文章代碼(AID): #1NyoFzzP (C_and_CPP)
文章代碼(AID): #1NyoFzzP (C_and_CPP)