C/C++ fclose 用法與範例

本篇 ShengYu 介紹 C/C++ fclose 的用法與範例,檔案的讀取或寫入都需要先開檔,有開檔就有關檔,fopen 開檔對應的關檔函式就是 fclose 。

C/C++ 要使用 fclose 的話需要引入的標頭檔 <stdio.h>,如果要使用 C++ 的標頭檔則是引入 <cstdio>
fclose 函式原型為

1
int fclose(FILE * stream);

stream:指向 FILE 物件的指標

以下 C/C++ fclose 的用法介紹將分為這幾部份,

  • C/C++ fclose 的基本用法
  • C/C++ fclose 正確的關檔

那我們開始吧!

C/C++ fclose 的基本用法

這邊介紹 C/C++ fclose 基本用法,fopen 開檔成功回傳不為 NULL,fopen 開檔失敗則會回傳 NULL,開檔成功的話就繼續處理之後的程式邏輯,接著使用 fputs 進行寫入字串,fputs 會將字串寫入直到遇見結束字元為止,最後再 fclose 關檔,

cpp-fclose.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// g++ cpp-fclose.cpp -o a.out
#include <stdio.h>

int main() {
FILE *fp;

fp = fopen("output.txt", "w");
if (fp == NULL) {
printf("failed to open the file.\n");
return 1; // EXIT_FAILURE
}

fputs("hello world\n", fp);
fputs("123", fp);
fputs("456", fp);
fclose(fp);
return 0;
}

輸出 output.txt 的內容如下,

1
2
hello world
123456

那麼為什麼開檔失敗就不用 fclose 關檔呢?詳見下一節。

C/C++ fclose 正確的關檔

這邊介紹 C/C++ fclose 正確的關檔方式與技巧,實務上有一些情況可能會導致 fp 為 NULL 而讓 fclose 對 NULL 進行關檔,例如開檔失敗,或其它手動賦值為 NULL 等等情形,那 fclose 對 NULL 進行關檔發生什麼事呢?

這邊示範 fclose 直接對 NULL 關檔看看會怎麼樣,

cpp-fclose2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
// g++ cpp-fclose2.cpp -o a.out
#include <stdio.h>

int main() {
FILE *fp;

fp = NULL;

// fputs("123", fp); // crash if fp is NULL
fclose(fp); // crash if fp is NULL

return 0;
}

結果程式會中止,產生 Segmentation fault,輸出如下,另外 fputs 寫入到 NULL 的 FILE * 檔案指標也是同樣的結果,

1
Segmentation fault (core dumped)

所以在 fclose 關檔時帶入的 FILE * 檔案指標是 NULL 的話就會造成很嚴重的後果,在程式撰寫時要特別小心注意。

以上就是 C/C++ fclose 的用法與範例介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
如果你想學習 C++ 相關技術,可以參考看看下面的文章,
C/C++ 新手入門教學懶人包
C/C++ fopen 用法與範例
C/C++ fread 用法與範例
C/C++ fgets 用法與範例
C/C++ fwrite 用法與範例
C/C++ fputs 用法與範例