1. 程式人生 > >Linux下面的檔案讀寫操作方式

Linux下面的檔案讀寫操作方式

在Linux裡面有三種方式可以讀寫檔案,分別是系統呼叫、C語言檔案操作、c++方式檔案操作。下面我們來分別看看這三種方式的操作:

1、系統呼叫:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

int creat(const char *pathname, mode_t mode);

O_RDONLY,以只讀開啟檔案
O_WRONLY, 以只寫開啟檔案
O_RDWR.以可讀可寫開啟檔案
O_EXEC 以只執行開啟檔案
O_SEARCH 只搜尋開啟(應用目錄)
常量的目的是在目錄開啟的時候驗證它的搜尋許可權。對目錄的群檔案描述符的後續操作就不需要再次檢查對該目錄的搜尋許可權。(部分作業系統支援)
以上五個常量中必須要指定一個,下面的常量是可選的
O_APPEND 開啟檔案並在檔案尾端增加。
O_CREAT 若檔案不存在則建立檔案,mode引數為建立的檔案有哪些許可權(rwx)
O_EXCL 只有陪同O_CREAT,有用,如果檔案存在報錯,不存在則建立檔案
。。。其他常量基本用不到,這幾個是通常要用到的常量選項。
下面我們來看看open系統呼叫的使用:
這裡以讀寫、檔案不存在是建立、在檔案尾部增加來開啟檔案的:
這裡寫圖片描述


這裡寫圖片描述
執行程式碼:
這裡寫圖片描述
如果增加常量選項O_EXCL,因為檔案存在而報錯:
這裡寫圖片描述
這裡寫圖片描述
如果加了常量O_TRUNC選項,檔案存在,而且是隻讀或者讀-寫的方式成功開啟,將會把檔案長度截斷為0:
這裡寫圖片描述

這裡寫圖片描述
這裡因為是先進性的讀檔案,原來檔案裡的記錄都被O_TRUNC這個常量截為0,讀不到資料,” world!”是最新寫入的。
還有一個函式專門用來建立檔案的:

#include<fcntl.h>
int creat(const char *path, mode_t mode);//成功返回檔案描述符,失敗返回-1
int open(path, O_WRONLY | O_CREAT|O_TRUNC, mode);
//二者等價

這裡寫圖片描述
執行結果:
這裡寫圖片描述

2、C語言檔案讀寫操作:

#include <stdio.h>

FILE *fopen(const char *path, const char *mode);
FILE *fdopen(int fd, const char *mode);
FILE *freopen(const char *path, const char *mode, FILE *stream);

上面三者都是開啟檔案的函式,他們分別的功能是:
(1)fopen函式開啟路徑名為path的一個指定檔案。
(2)freopen函式在一個指定的檔案流上開啟一個指定的檔案,如果檔案流是開啟的,則先關閉檔案流。若該流已經定向,則使用freopen清除定向。此函式一般用於將一個指定的檔案開啟為一個預定義的流:標準輸入、標準輸出、標準錯誤輸出。該函式的簡單使用在部落格:http://blog.csdn.net/magiclyj/article/details/75677536 .
(3)fdopen函式取一個已有的檔案描述符,並使一個標準的I/O流與該描述符相結合。該函式經常用於由建立管道和網路通訊函式返回的描述符,因為這些特殊的型別的檔案不能用標準I/O函式fopen開啟,所以我們必須先呼叫裝置專用函式以獲得一個檔案描述符,然後使用fdopen使一個標準I/O流與該檔案描述符相結合。
三個函式的mode選項:
r和rb :以只讀的方式開啟檔案,前提檔案先存在。
w和wb:以只寫的方式開啟檔案,檔案不存在建立檔案,檔案存在會先清除檔案內容從檔案開始位置寫資料。
a和ab:追加,在檔案尾部寫寫而開啟,或者為寫而建立檔案
r+和rb+和r+b:為讀和寫開啟檔案
w+和wb+和r+b:把檔案截斷置0長,或為讀和寫而開啟
a+和ab+和a+b:在檔案尾部讀和寫而開啟或者建立

如果以和寫開啟檔案的時候,有以下限制:
~如果中間沒有fflush、fseek、fsetpos、rewind,則在輸出的後面不能直接跟著輸入。
~如果中間沒有fseek、fsetpos、rewind,或者一個輸入操作沒有到達檔案尾端,則再輸入操作之後不能跟隨輸出。

下面我們來看看C語言的檔案操作:
這裡寫圖片描述
執行結果:
這裡寫圖片描述

3、c++的檔案讀寫:

#include <fstream>  
ofstream         //檔案寫操作 記憶體寫入儲存裝置   
ifstream         //檔案讀操作,儲存裝置讀區到記憶體中  
fstream          //讀寫操作,對開啟的檔案可進行讀寫操作 

寫檔案:
這裡寫圖片描述
執行結果:
這裡寫圖片描述
讀檔案:
這裡寫圖片描述
執行結果:
這裡寫圖片描述