C 語言中 open 與 fopen 的對比

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

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

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

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

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.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);
}
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C File