C 語言中 open 與 fopen 的對比

Jinku Hu 2023年10月12日
  1. 使用 fopen 函式在 C 語言中開啟或建立檔案
  2. 使用 open 函式在 C 語言中開啟或建立一個檔案
  3. 使用 creat 函式開啟和建立一個檔案
C 語言中 open 與 fopen 的對比

本文將演示在 C 語言中使用 openfopen 函式的多種方法。

使用 fopen 函式在 C 語言中開啟或建立檔案

fopen 是 C 標準庫函式,用於處理作為流物件的檔案的開啟。與本質上是系統呼叫的 open 函式不同,fopenFILE 指標物件與給定的檔案相關聯。它需要兩個引數;第一個引數代表要開啟的檔案的路徑名,第二個引數是開啟檔案的模式。

請注意,fopen 的模式引數有多個預定義的值,所有這些值都在函式手冊頁面中詳細說明。在下面的示例程式碼中,我們指定了 w+ 模式,該模式開啟檔案進行讀寫,同時截斷內容並將流定位在開頭。注意,如果給定的函式路徑不存在,則呼叫會建立一個新的檔案進行寫入。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char* str = "Arbitrary string to be written to a file.\n";

int main(void) {
  const char* filename = "innn.txt";

  FILE* output_file = fopen(filename, "w+");
  if (!output_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }
  fwrite(str, 1, strlen(str), output_file);
  printf("Done Writing!\n");

  fclose(output_file);

  exit(EXIT_SUCCESS);
}

輸出:

Done Writing!

使用 open 函式在 C 語言中開啟或建立一個檔案

相比之下,open 函式本質上是一個低階的系統服務,即使使用 fopen 也會被呼叫。需要注意的是,系統呼叫通常是用 C 庫的封裝函式提供給終端使用者的,但其特點和效能用例與 C stio 庫中的函式不同。如:open 在建立新檔案時,第二個引數取型別為 int,第三個引數可選,指定檔案模式位。在下面的例子中,我們演示了與前面示例程式碼中類似的功能。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char* str = "Arbitrary string to be written to a file.\n";

int main(void) {
  const char* filename = "innn.txt";

  int fd = open(filename, O_RDWR | O_CREAT);
  if (fd == -1) {
    perror("open");
    exit(EXIT_FAILURE);
  }

  write(fd, str, strlen(str));
  printf("Done Writing!\n");

  close(fd);

  exit(EXIT_SUCCESS);
}

open 呼叫建立一個新的檔案描述符,並將其值返回給呼叫者;否則,失敗時返回 -1,並相應設定 errno。接下來的程式碼示例顯示了 open 呼叫,可選的模式引數指定為 S_IRWXU。這些符號是在 <fcntl.h> 頭定義的巨集,表示檔案的不同許可權標誌。S_IRWXU 意味著檔案所有者將對新建立的檔案有讀/寫/執行的許可權。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char* str = "Arbitrary string to be written to a file.\n";

int main(void) {
  const char* filename = "innn.txt";

  int fd = open(filename, O_CREAT | O_WRONLY | O_APPEND, S_IRWXU);
  if (fd == -1) {
    perror("open");
    exit(EXIT_FAILURE);
  }

  write(fd, str, strlen(str));
  printf("Done Writing!\n");

  close(fd);

  exit(EXIT_SUCCESS);
}

使用 creat 函式開啟和建立一個檔案

open 中包含的另一個系統呼叫是 creat 函式,它可以專門用來建立一個新檔案,或者如果檔案已經存在,則將其截斷為零長度。請注意,這個函式本質上等於 open 呼叫,其引數如下-O_CREAT | O_WRONLY | O_TRUNC。因此,與 open 相比,它只需要兩個引數,省略了第二個 flags 引數。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char* str = "Arbitrary string to be written to a file.\n";

int main(void) {
  const char* filename = "innn.txt";

  int fd = creat(filename, S_IRWXG);
  if (fd == -1) {
    perror("open");
    exit(EXIT_FAILURE);
  }

  write(fd, str, strlen(str));
  printf("Done Writing!\n");

  close(fd);

  exit(EXIT_SUCCESS);
}
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C File