C 語言中 open 與 fopen 的對比
本文將演示在 C 語言中使用 open
與 fopen
函式的多種方法。
使用 fopen
函式在 C 語言中開啟或建立檔案
fopen
是 C 標準庫函式,用於處理作為流物件的檔案的開啟。與本質上是系統呼叫的 open
函式不同,fopen
將 FILE
指標物件與給定的檔案相關聯。它需要兩個引數;第一個引數代表要開啟的檔案的路徑名,第二個引數是開啟檔案的模式。
請注意,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);
}