文件是程序設計的一個重要的概念,在C語言中,常常將處理數(shù)據(jù)的程序,和要處理的數(shù)據(jù)分離開來.提高程序的方便性和實用性.
- 文件的基本概念:數(shù)據(jù)流,緩沖區(qū),文件類型,文件存取方式
- 文件的打開和關閉: fopen,fclose
- 文本文件讀寫操作: fgetc,fputc,fgets,fputs,fscanf,fprintf 函數(shù)
- 二進制文件讀寫操作: fwrite,fread 函數(shù)
- 文件的定位函數(shù): rewind,fseek,ftell 函數(shù)
- 文件檢測函數(shù): feof,ferror,clearerr 函數(shù)
文件具有多樣性,存在磁盤的叫磁盤文件,計算機相連的設備是設備文件,存放數(shù)據(jù)的是數(shù)據(jù)文件.而已二進制存儲的是二進制文件,存放程序的是源文件.
數(shù)據(jù)文件指一組相關的有序集合.存儲在外部介質上,并用文件名作為其文件標志.在程序執(zhí)行期間,必須先調入內存.每次讀寫都需要讀取磁盤數(shù)據(jù)文件就非常費時,于是為了加速文件存取速率.系統(tǒng)使用緩沖區(qū)進行數(shù)據(jù)的暫存.從文件中讀寫變成從緩沖區(qū)中讀寫.
- 二進制文件與ASCll碼文件
ASCll碼文件也就是文本文件,在計算機中以字節(jié)存儲,每個字符對應一個字節(jié).二進制文件,采用二進制編碼.
但在c系統(tǒng)中處理文件時,并不區(qū)分其類型.都看做字符流.按字節(jié)處理.
- 緩存區(qū)是程序執(zhí)行時,系統(tǒng)提供的額外內存.用來存儲準備執(zhí)行的數(shù)據(jù).它的設置是為了提高存取效率.內存的存取比磁盤驅動器快多了.c語言標準i/o函數(shù)(包含在stdio,h中).系統(tǒng)會自動設置緩存區(qū).
文件的讀寫操作都是先對緩存區(qū)進行操作的,只有在關閉文件后才會寫入磁盤
- 文件的存取方式主要分兩種;順序存取和隨機存取
- 文件類型指針
在緩沖文件系統(tǒng)中,針對每個被使用的文件在內存中開辟一個區(qū)域,用來存放文件的有關信息(名字,文件狀態(tài),當前位置等).這些信息封裝在一個文件結構體類型中.每個文件的信息都保存在一個文件結構體指針變量中.
文件結構體是系統(tǒng)定義的,c語言規(guī)定該類型為FIILE類型.
typedef struct{
short level; // 緩沖區(qū)滿或空的程度
unsigned flags; //文件狀態(tài)的標志
char fd; //文件描述符
unsigned char hold; // 如沒有緩沖區(qū)則不讀取文件
short bsize; // 緩沖區(qū)大小
unsigned char* buffer; // 數(shù)據(jù)緩沖區(qū)的位置
unsigned ar* curp; //指針,當前的指向
unsigned istemp; //臨時文件
short token; // 用于有效性檢查.
}
可以引用文件類型定義文件類型變量來實現(xiàn)對文件的操作.
- 打開文件
FILE *fp;
fopen_s(&fp,"test.txt","w");
- 關閉文件
fclose(fp);
文件的打開關閉需要配套使用.
文件的使用方式
r只讀(打開),r+讀寫(不存在返回空,讀寫從頭開始,寫時覆蓋).
w只寫(打開或建立文件,內容全部消失).w+讀寫(打開或新建,讀寫可以通過位置函數(shù)定義)
a追加數(shù)據(jù).(打開或新建),a+(讀寫,位置可以定義) 以上都對文本文件進行操作.
rb,rb+,wb,wb+,ab,ab+都是對二進制文件操作.
文件的讀寫
- fgetc 逐字符讀取.fputc逐字符寫入:
// 逐字符讀取文件
void R_filechar(const char* ch){
FILE* pfile;
fopen_s(&pfile, ch, "r");
if (pfile == NULL)
{
printf("open file error");
}
else {
char cha = fgetc(pfile);
while (cha != EOF) {
putchar(cha);
cha = fgetc(pfile);
}
fclose(pfile);
}
}
- fgets與fputs 逐字符串讀取函數(shù):
// 字符串讀取文件
void R_filestr(const char* ch) {
char a[20];
FILE* pfile;
fopen_s(&pfile,ch,"r");
if (pfile == NULL)
{
printf("open file error");
}
else {
int i = 0;
fgets(a,20,pfile);
while (i<4)
{
printf("%s\n",a);
fgets(a, 20, pfile);
i++;
}
fclose(pfile);
}
}
- fwrite與fread函數(shù),以數(shù)據(jù)塊為單位的二進制文件讀取函數(shù).和格式化讀寫函數(shù):fscanf,fprintf:(比較常用的)
//數(shù)據(jù)塊寫入文件(struct)
void W_filestu(const char* ch,Student* pstu) {
FILE* pfile;
fopen_s(&pfile, ch, "wb+");
if (pfile == NULL)
{
printf("open file error");
}
else {
fwrite(pstu,sizeof(Student),2,pfile);
// fprintf(pfile,"%s%d%d%s",pstu->name,pstu->num,pstu->age,pstu->addr);
fclose(pfile);
}
}
void R_filestu(const char* ch, Student* qstu) {
FILE* pfile;
fopen_s(&pfile, ch, "rb");
if (pfile == NULL)
{
printf("open file error");
}
else {
fread(qstu, sizeof(Student), 2, pfile);
// fscanf(pfile, "%s\t%d\t%d\t%s",qstu->name,&qstu->num,&qstu->age,qstu->addr);
for (int i = 0; i < 2; i++, qstu++)
{
printf("%s\t%d\t%d\t%s\n", qstu->name, qstu->num, qstu->age, qstu->addr);
}
fclose(pfile);
}
}
當然,最常使用的還是fwrite,fread函數(shù),對結構體進行存取.
文件定位函數(shù)
rewind(文件指針): 返回當文件頭部.
fseek(文件指針,位移量,起始點), 位移量指的是以字節(jié)為單位.起始點表示從何處計算位移量:
起始點 | 表示符號 | 數(shù)字表示 |
---|---|---|
文件首 | SEEK_SET | 0 |
當前位置 | SEEK_SET | 1 |
文件尾 | SEEK_SET | 2 |
- ftell函數(shù),用來得到文件位置指針當前位置相對于文件首偏移的字節(jié)數(shù).通常配合fseek函數(shù).
文件檢測函數(shù)
feof()函數(shù). 用來檢測文件位置指針是否處于文件結束位置.通常用來做遍歷文件的判斷條件.是一個經(jīng)常使用到的函數(shù).到達返回true,否則返回false.
feeror(),讀寫文件是否出錯的檢測函數(shù),返回0表示未出錯,否則有錯.
2019.12.25
17:07