打開文件、新建文件和關閉文件操作
打開文件操作使用系統調用函數open(),該函數的作用是建立一個文件描述符,其他的函數可以通過文件描述符對指定文件進行讀取與寫入的操作。打開文件的一般形式是:
- open(文件路徑, 標志);
函數的返回值是文件描述符,如果打開文件成功返回一個正整數,否則返回-1。標志是用於指定打開文件操作模式的枚舉常量,主標志如表13.1所示。
表13.1 打開文件操作的主標志
參 數 |
說 明 |
參 數 |
說 明 |
O_RDONLY |
以只讀方式打開文件 |
O_RDWR |
以可讀寫方式打開文件 |
O_WRONLY |
以只寫方式打開文件 |
|
|
主標志是互斥的,使用其中一種則不能再使用另外一種。除了主標志以外,還有副標志可與它們配合使用,副標志可同時使用多個,使用時在主標志和副標志之間加入按位與(|)運算符,如表13.2所示。
表13.2 打開文件操作的副標志
參 數 |
說 明 |
O_APPEND |
讀寫文件從文件尾部開始移動,所寫入 的數據追加到文件尾 |
O_TRUNC |
若文件存在並且以可寫的方式打開時, 此標志會將文件長度清為0,而原來存於 該文件的資料也會消失 |
O_CREAT |
若路徑中的文件不存在則自動建立該文件 |
O_EXCL |
如果與O_CREAT同時設置,此指令會去檢 查文件是否存在,文件若不存在則建立該文 件,否則將導致打開文件錯誤。此外,若 O_CREAT與O_EXCL同時設置,並且將要 打開的文件為符號連接,則將導致打開文件失敗 |
新建文件操作是在打開文件操作的函數上加入O_CREAT副標志實現的。當路徑中的文件不存在時,則創建一個新文件。創建新文件的同時可設置文件的權限,這時函數需要增加一組實際參數,形式為:
- open(文件路徑, 標志, 權限標志);
文件權限標志如表13.3所示。
表13.3 文件權限標志
參 數 |
說 明 |
參 數 |
說 明 |
S_IRUSR |
所有者擁有 讀權限 |
S_IXGRP |
群組擁有執 行權限 |
S_IWUSR |
所有者擁有 寫權限 |
S_IROTH |
其他用戶擁 有讀權限 |
S_IXUSR |
所有者擁有 執行權限 |
S_IWOTH |
其他用戶擁 有寫權限 |
S_IRGRP |
群組擁有讀權限 |
S_IXOTH |
其他用戶擁 有執行權限 |
S_IWGRP |
群組擁有寫權限 |
|
|
文件權限標志也可以使用加權數字表示,這組數字被稱為umask變量,它的類型是mode_t,是一個無符號八進制數。umask變量的定義方法如表13.4所示。umask變量由3位數字組成,數字的每一位代表一類權限。用戶所獲得的權限是加權數值的總和。例如764表示所有者擁有讀、寫和執行權限,群組擁有讀和寫權限,其他用戶擁有讀權限。
表13.4 umask變量表示方法
加 權 數 值 |
第1位 |
第2位 |
第3位 |
4 |
所有者擁有 讀權限 |
群組擁有讀權限 |
其他用戶擁 有讀權限 |
2 |
所有者擁有 寫權限 |
群組擁有寫權限 |
其他用戶擁 有寫權限 |
1 |
所有者擁有 執行權限 |
群組擁有執行權限 |
其他用戶擁 有執行權限 |
新建文件的另一個函數是creat(),該函數的一般形式是:
- creat(路徑, umask);
當文件被成功創建函數的返回值為0,否則為-1。當文件不需要使用了,則可以使用close()函數關閉文件。關閉文件的一般形式為:close(文件描述符),如果關閉文件成功,close()函數的返回0,否則返回-1。
下例將演示打開文件、新建文件和關閉文件這3種操作。程序的邏輯為:指定一個路徑,如果該文件存在,輸出提示信息,關閉該文件;如果該文件不存在,則新建文件並設置文件屬性,輸出提示信息,然后關閉該文件。完整的代碼如下:
- #include <fcntl.h> // 提供open()函數
- #include <sys/types.h> // 提供mode_t類型
- #include <sys/stat.h> // 提供open()函數的符號
- #include <unistd.h> // 提供close()函數
- #include <stdio.h>
- int main()
- {
- int f; // 聲明變量f,
用於保存文件標識符 - const char *f_path = "test"; // 定義路徑字符串
- mode_t f_attrib; // 聲明mode_t
型變量,保存文件屬性 - f_attrib = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;
- // 為umask變量賦值
- f = open(f_path, O_RDONLY); // 以只讀方式打開文件
- if (f == -1) { // 判斷文件是否打開成功
- f =open(f_path, O_RDWR | O_CREAT, f_attrib); // 創建新文件
- if (f != -1) //
判斷文件創建是否成功 - puts("創建一個新文件");
- else {
- puts("無法創建新文件,程序退出");
- return 1;
- }
- }
- else
- puts("文件打開成功");
- close(f); // 關閉文件
- return 0;
- }
該程序首先判斷是否存在文件test,判斷的方法是用open()函數打開test文件,如果返回值是-1,則表示該文件不存在(有時候並非如此)。當文件不存在時,使用open()函數創建該文件,並在程序最后關閉。為mode_t型變量f_attrib賦值的方法使用了按位計算操作,將表示文件權限的常量進行按位或計算,計算的結果與八進制數0664相同,如圖13.3所示。
原文:http://book.51cto.com/art/200912/169537.htm