在C語言中用一個指針變量指向一個文件,這個指針稱為文件指針。通過文件指針就可對它所指的文件進行各種操作。
三水網站制作公司哪家好,找創新互聯!從網頁設計、網站建設、微信開發、APP開發、響應式網站等網站項目制作,到程序開發,運營維護。創新互聯2013年至今到現在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選創新互聯。
定義說明文件指針的一般形式為:
FILE *指針變量標識符;
其中FILE應為大寫,它實際上是由系統定義的一個結構,該結構中含有文件名、文件狀態和文件當前位置等信息。在編寫源程序時不必關心FILE結構的細節。例如:
FILE *fp;
表示fp是指向FILE結構的指針變量,通過fp即可找存放某個文件信息的結構變量,然后按結構變量提供的信息找到該文件,實施對文件的操作。習慣上也籠統地把fp稱為指向一個文件的指針。
文件在進行讀寫操作之前要先打開,使用完畢要關閉。所謂打開文件,實際上是建立文件的各種有關信息,并使文件指針指向該文件,以便進行其它操作。關閉文件則斷開指針與文件之間的聯系,也就禁止再對該文件進行操作。
在C語言中,文件操作都是由庫函數來完成的。在本章內將介紹主要的文件操作函數。
文件的打開(fopen函數)
fopen函數用來打開一個文件,其調用的一般形式為:
文件指針名 = fopen( 文件名, 使用文件方式 );
其中:
“文件指針名”必須是被說明為FILE 類型的指針變量;
“文件名”是被打開文件的文件名;
“使用文件方式”是指文件的類型和操作要求;
“文件名”是字符串常量或字符串數組。
例如:
FILE *fp;
fp=("file a","r");
其意義是在當前目錄下打開文件file a,只允許進行“讀”操作,并使fp指向該文件。又如:
FILE *fphzk;
fphzk=("c:\\hzk16","rb");
其意義是打開C驅動器磁盤的根目錄下的文件hzk16,這是一個二進制文件,只允許按二進制方式進行讀操作。兩個反斜線“\\ ”中的第一個表示轉義字符,第二個表示根目錄。
使用文件的方式共有12種,下面給出了它們的符號和意義。
文件使用方式
意義
rt 只讀打開一個文本文件,只允許讀數據
wt 只寫打開或建立一個文本文件,只允許寫數據
at 追加打開一個文本文件,并在文件末尾寫數據
rb 只讀打開一個二進制文件,只允許讀數據
wb 只寫打開或建立一個二進制文件,只允許寫數據
ab 追加打開一個二進制文件,并在文件末尾寫數據
rt+ 讀寫打開一個文本文件,允許讀和寫
wt+ 讀寫打開或建立一個文本文件,允許讀寫
at+ 讀寫打開一個文本文件,允許讀,或在文件末追加數據
rb+ 讀寫打開一個二進制文件,允許讀和寫
wb+ 讀寫打開或建立一個二進制文件,允許讀和寫
ab+ 讀寫打開一個二進制文件,允許讀,或在文件末追加數據
對于文件使用方式有以下幾點說明。
1) 文件使用方式由r、w、a、t、b 和 + 六個字符拼成,各字符的含義是:
r(read):讀
w(write):寫
a(append):追加
t(text):文本文件,可省略不寫
b(banary):二進制文件
+:讀和寫
2) 凡用“r”打開一個文件時,該文件必須已經存在,且只能從該文件讀出。
3) 用“w”打開的文件只能向該文件寫入。若打開的文件不存在,則以指定的文件名建立該文件,若打開的文件已經存在,則將該文件刪去,重建一個新文件。
4) 若要向一個已存在的文件追加新的信息,只能用“a”方式打開文件。但此時該文件必須是存在的,否則將會出錯。
5) 在打開一個文件時,如果出錯,fopen將返回一個空指針值NULL。在程序中可以用這一信息來判別是否完成打開文件的工作,并作相應的處理。因此常用以下程序段打開文件:
if((fp=fopen("c:\\hzk16","rb")==NULL){
printf("\nerror on open c:\\hzk16 file!");
getch();
exit(1);
}
這段程序的意義是,如果返回的指針為空,表示不能打開C盤根目錄下的hzk16文件,則給出提示信息“error on open c:\ hzk16 file!”,下一行getch()的功能是從鍵盤輸入一個字符,但不在屏幕上顯示。在這里,該行的作用是等待,只有當用戶從鍵盤敲任一鍵時,程序才繼續執行,因此用戶可利用這個等待時間閱讀出錯提示。敲鍵后執行exit(1)退出程序。
6) 把一個文本文件讀入內存時,要將ASCII碼轉換成二進制碼,而把文件以文本方式寫入磁盤時,也要把二進制碼轉換成ASCII碼,因此文本文件的讀寫要花費較多的轉換時間。對二進制文件的讀寫不存在這種轉換。
7) 標準輸入文件(鍵盤),標準輸出文件(顯示器),標準出錯輸出(出錯信息)是由系統打開的,可直接使用。
文件關閉函數(fclose函數)
文件一旦使用完畢,應用關閉文件函數把文件關閉,以避免文件的數據丟失等錯誤。
fclose函數調用的一般形式是:
fclose(文件指針);
例如:
fclose(fp);
正常完成關閉文件操作時,fclose函數返回值為0。如返回非零值則表示有錯誤發生。
c語言的fopen函數編譯鏈接后會將代碼整合到exe文件中
api的函數編譯鏈接后只是將函數調用信息寫入,程序運行時動態鏈接
應該是這樣
C語言open()函數:打開文件函數
相關函數:read, write, fcntl, close, link,stat, umask, unlink, fopen
頭文件:#include sys/types.h #includesys/stat.h #include fcntl.h
定義函數:
intopen(const char * pathname, int flags);
intopen(const char * pathname, int flags, mode_t mode);
函數說明:
參數 pathname 指向欲打開的文件路徑字符串. 下列是參數flags 所能使用的旗標:
O_RDONLY 以只讀方式打開文件
O_WRONLY 以只寫方式打開文件
O_RDWR 以可讀寫方式打開文件. 上述三種旗標是互斥的, 也就是不可同時使用, 但可與下列的旗標利用OR(|)運算符組合.
O_CREAT 若欲打開的文件不存在則自動建立該文件.
O_EXCL 如果O_CREAT 也被設置, 此指令會去檢查文件是否存在. 文件若不存在則建立該文件, 否則將導致打開文件錯誤. 此外, 若O_CREAT 與O_EXCL 同時設置, 并且欲打開的文件為符號連接, 則會打開文件失敗.
O_NOCTTY 如果欲打開的文件為終端機設備時, 則不會將該終端機當成進程控制終端機.
O_TRUNC 若文件存在并且以可寫的方式打開時, 此旗標會令文件長度清為0, 而原來存于該文件的資料也會消失.
O_APPEND 當讀寫文件時會從文件尾開始移動, 也就是所寫入的數據會以附加的方式加入到文件后面.
O_NONBLOCK 以不可阻斷的方式打開文件, 也就是無論有無數據讀取或等待, 都會立即返回進程之中.
O_NDELAY 同O_NONBLOCK.
O_SYNC 以同步的方式打開文件.
O_NOFOLLOW 如果參數pathname 所指的文件為一符號連接, 則會令打開文件失敗.
O_DIRECTORY 如果參數pathname 所指的文件并非為一目錄, 則會令打開文件失敗。注:此為Linux2. 2 以后特有的旗標, 以避免一些系統安全問題.
參數mode 則有下列數種組合, 只有在建立新文件時才會生效, 此外真正建文件時的權限會受到umask 值所影響, 因此該文件權限應該為 (mode-umaks).
S_IRWXU00700權限, 代表該文件所有者具有可讀、可寫及可執行的權限.
S_IRUSR或S_IREAD, 00400 權限,代表該文件所有者具有可讀取的權限.
S_IWUSR或S_IWRITE, 00200 權限, 代表該文件所有者具有可寫入的權限.
S_IXUSR或S_IEXEC, 00100 權限,代表該文件所有者具有可執行的權限.
S_IRWXG00070 權限, 代表該文件用戶組具有可讀、可寫及可執行的權限.
S_IRGRP00040 權限, 代表該文件用戶組具有可讀的權限.
S_IWGRP00020 權限, 代表該文件用戶組具有可寫入的權限.
S_IXGRP00010 權限, 代表該文件用戶組具有可執行的權限.
S_IRWXO00007 權限, 代表其他用戶具有可讀、可寫及可執行的權限.
S_IROTH00004 權限, 代表其他用戶具有可讀的權限
S_IWOTH00002 權限, 代表其他用戶具有可寫入的權限.
S_IXOTH00001 權限, 代表其他用戶具有可執行的權限.
返回值:若所有欲核查的權限都通過了檢查則返回0 值, 表示成功, 只要有一個權限被禁止則返回-1.
錯誤代碼:
EEXIST參數pathname 所指的文件已存在, 卻使用了O_CREAT 和O_EXCL旗標.
EACCESS參數pathname 所指的文件不符合所要求測試的權限.
EROFS 欲測試寫入權限的文件存在于只讀文件系統內.
EFAULT參數pathname 指針超出可存取內存空間.
EINVAL參數mode 不正確.
ENAMETOOLONG參數 pathname 太長.
ENOTDIR參數pathname 不是目錄.
ENOMEM核心內存不足.
ELOOP 參數pathname 有過多符號連接問題.
EIOI/O 存取錯誤.
附加說明:使用access()作用戶認證方面的判斷要特別小心, 例如在access()后再作open()空文件可能會造成系統安全上的問題.
范例
#includeunistd.h
#includesys/types.h
#includesys/stat.h
#includefcntl.h
main()
{
intfd, size;
chars[] = "Linux Programmer!\n", buffer[80];
fd =open("/tmp/temp", O_WRONLY|O_CREAT);
write(fd, s, sizeof(s));
close(fd);
fd =open("/tmp/temp", O_RDONLY);
size= read(fd, buffer, sizeof(buffer));
close(fd);
printf("%s", buffer);
}
執行
LinuxProgrammer!