首先介紹兩個函數:
/*
函數功能:開啟一個檔案
函數原型:FILE * fopen(const char * path,const char * mode);
相關函數:open,fclose,fopen_s[1],_wfopen
所需庫:<stdio.h>
傳回值:檔案順利開啟後,指向該流的檔案指標就會被返回。如果檔案開啟失敗則返回NULL,並把錯誤碼存在errno 中。
一般而言,開啟檔案後會作一些檔案讀取或寫入的動作,若開啟檔案失敗,接下來的讀寫動作也無法順利進行,所以一般在fopen()後作錯誤判斷及處理。
參數說明:
參數path字串包含欲開啟的檔案路徑及檔案名稱,參數mode字串則代表著流形態。
mode有下列幾種形態字串:
r 以唯讀方式開啟檔案,該檔案必須存在。
r+ 以可讀寫方式開啟檔案,該檔案必須存在。
rb+ 讀寫開啟一個二進位檔案,允許讀寫資料。
rw+ 讀寫開啟一個文字檔,允許讀和寫。
w 開啟唯寫檔案,若檔案存在則檔案長度清為0,即該檔案內容會消失。若檔案不存在則建立該檔案。
w+ 開啟可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案。
a 以附加的方式開啟唯寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的內容會被保留。(EOF符保留)
a+ 以附加方式開啟可讀寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即檔案原先的內容會被保留。 (原來的EOF符不保留)
wb 唯寫開啟或建立一個二進位檔案;只允許寫資料。
wb+ 讀寫開啟或建立一個二進位檔案,允許讀和寫。
ab+ 讀寫開啟一個二進位檔案,允許讀或在檔案末追加資料。
at+ 開啟一個叫string的檔案,a表示append,就是說寫入處理的時候是接著原來檔案已有內容寫入,不是從頭寫入覆蓋掉,t表示開啟檔案的類型是文字檔,+號表示對檔案既可以讀也可以寫。
上述的形態字串都可以再加一個b字元,如rb、w+b或ab+等組合,加入b 字元用來告訴函數庫以二進位模式開啟檔案。如果不加b,表示預設加了t,即rt,wt,其中t表示以文字模式開啟檔案。由fopen()所建立的新檔案會具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)許可權,此檔案許可權也會參考umask 值。
有些C編譯系統可能不完全提供所有這些功能,有的C版本不用"r+","w+","a+",而用"rw","wr","ar"等,讀者注意所用系統的規定。
二進位和文字模式的區別
1.在windows系統中,文字模式下,檔案以""代表換行。若以文字模式開啟檔案,並用fputs等函數寫入分行符號"\n"時,函數會自動在"\n"前面加上"\r"。即實際寫入檔案的是"" 。
2.在類Unix/Linux系統中文字模式下,檔案以"\n"代表換行。所以Linux系統中在文字模式和二進位模式下並無區別。
*/
/*
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
注意:這個函數以二進位形式對檔案進行操作,不局限於文字檔
傳回值:返回實際寫入的資料區塊數目
(1)buffer:是一個指標,對fwrite來說,是要擷取資料的地址;
(2)size:要寫入內容的單位元組數;
(3)count:要進行寫入size位元組的資料項目的個數;
(4)stream:目標檔案指標;
(5)返回實際寫入的資料項目個數count。
*/
測試代碼:
// fopenTest.cpp : 定義控制台應用程式的進入點。//#include "stdafx.h"#include "string.h" //strlen()需要的標頭檔#include "stdlib.h" //itoa()需要的標頭檔int _tmain(int argc, _TCHAR* argv[]){char buffer[7]="aaa\r\n";FILE *file = fopen("E:\\filetest.log","ab");fwrite(buffer,sizeof(char),sizeof(char)*5/*其中的兩個\是轉義不參與個數*/,file); const char*pFilename = const_cast<char*>(__FILE__);//const char*pFileline = const_cast<char*>(__LINE__);char*pFileline =new char[256];itoa(__LINE__,pFileline,10); //long->char fwrite(pFilename,sizeof(char),strlen(pFilename),file);fwrite(pFileline,sizeof(char),strlen(pFileline),file);fclose(file);return 0;}