首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

fopen 與 fopen_s 差異比較與安全用法

     編輯:關於C語言

前言

fopen 是 C 標準庫函式,fopen_s 為 C11 附錄 K / Microsoft 延伸的安全版本。兩者在參數順序、回傳值、錯誤處理上有關鍵差異,混用易導致 Bug。

函式原型對照

項目fopenfopen_s
原型FILE* fopen(const char* filename, const char* mode);errno_t fopen_s(FILE** pFile, const char* filename, const char* mode);
檔案指標回傳值透過第一參數 pFile 輸出
成功回傳非 NULL 指標0
失敗回傳NULL非零錯誤碼(如 EINVAL、ENOENT)
參數檢查無檢查空指標、模式字串合法性

使用範例

fopen(標準寫法)

FILE* fp = fopen("data.txt", "w");
if (!fp) {
    perror("fopen failed");
    return -1;
}
// ... 使用 fp
fclose(fp);

fopen_s(Windows/MSVC 推薦)

FILE* fp = nullptr;
errno_t err = fopen_s(&fp, "data.txt", "w");
if (err != 0 || !fp) {
    std::cerr << "fopen_s failed, errno=" << err << '\n';
    return -1;
}
// ... 使用 fp
fclose(fp);

關鍵差異總結

  1. 參數順序不同:fopen_s 多一層間接,第一參數為 FILE**
  2. 回傳值語意不同:fopen 回傳指標,fopen_s 回傳錯誤碼
  3. 安全性:fopen_s 會驗證參數合法性,減少未定義行為
  4. 可移植性:fopen 為標準 C,跨平台通用;fopen_s 主要支援 Windows/MSVC、部分 C11 實作

最佳實務建議

  • 跨平台專案:使用 fopen 搭配手動參數檢查
  • Windows 專屬專案:優先 fopen_s,並檢查 errno_t
  • C++17 以上:考慮 std::filesystem + std::fstream 完全避開 C API
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved