檔案
指儲存在外存介質(如磁碟、光碟、U盤等)上的資料集合。每一個檔案有唯一的檔名,作業系統按名字存取檔案。
檔名:通常由路徑、主檔名、副檔名三部分組成 例如:F : \C_2011\labs\lab_15.doc
檔案分類
可以從不同的角度對檔案進行分類
1、根據檔案的內容,可分為程式檔案和資料檔案。而程式檔案又可分為原始檔、目標檔案和可執行檔案;
2、根據檔案的組織形式,可分為順序存取檔案和隨機存取檔案
3、根據檔案的儲存形式,可分為文字檔案(即ASCII碼)和二進位制
4、從使用者的角度看,檔案還可分為普通檔案和裝置檔案
文字檔案:每一個位元組儲存1個字元,因而便於對字元進行逐個處理。但一般佔用儲存空間較多,而且要花費轉換時間(二進位制與ASCII碼之間的轉換)
二進位制檔案:把記憶體中的資料,原樣輸出到磁碟檔案中。可以節省儲存空間和轉換時間,但一個位元組並不對應1個字元,不能直接輸出字元形式。
讀檔案與寫檔案
讀檔案:是指將磁碟檔案中的資料傳送到計算機記憶體的操作,又稱輸入,例如,將磁碟檔案調入記憶體進行編輯
寫檔案:是指從計算機記憶體向磁碟檔案中傳送資料的操作,又稱輸出,例如,將編輯好的檔案儲存到磁碟中
C語言將檔案看作是由一個一個的字元(ASCII碼檔案)或位元組(二進位制檔案)組成的,因此稱為流式檔案。
C語言中的資料檔案是由一連串的字元(或位元組)組成,而不考慮行的界限,兩行資料間不會自動加分隔符,對檔案的存取是以字元(位元組)為單位的。輸入輸出資料流的開始和結束僅受程式控制而不受物理符號(如回車換行符)控制。
ANSI C的緩衝檔案系統
緩衝檔案系統:是指系統自動地在記憶體區為每個正在使用的檔案開闢一個緩衝區。
從記憶體向磁碟輸出資料時,必須首先輸出到緩衝區中。待緩衝區裝滿後,再一起輸出到磁碟檔案中。
從磁碟檔案向記憶體讀入資料時,則正好相反:首先將一批資料讀入到緩衝區中,再從緩衝區中將資料逐個送到程式資料區。
檔案型別指標
在緩衝檔案系統中,每個被使用的檔案都在記憶體中開闢一個相應的檔案資訊區,用來存放檔案的有關資訊(如檔案的名字、檔案狀態及檔案當前位置等)。 這些資訊是儲存在一個結構體變數中的。該結構體型別是由系統宣告的,取名為FILE。宣告FILE結構體型別的資訊包含在標頭檔案“stdio.h”中。
說明:
不必熟悉FILE的成員;
通常設定一個指向FILE型別變數的指標變數,然後通過它來操作相關檔案。
指標變數說明: FILE *fp fp是一個指標變數,它指向某個檔案的結構體變數,從而通過該結構體變數中的檔案資訊能夠訪問該檔案。
用法: 檔案開啟時,系統自動建立檔案結構體,並把指向它的指標返回來,程式通過這個指標獲得檔案資訊,訪問檔案。 檔案關閉後,它的檔案結構體被釋放。
檔案的開啟與關閉
(1)檔案的開啟與關閉的含義 對檔案進行操作之前,必須先開啟該檔案;使用結束後,應立即關閉,以免資料丟失。
所謂“開啟”:是指為檔案建立相應的資訊區(用來存放有關檔案的資訊)和檔案緩衝區(用來暫時存放輸入輸出的資料)。
在編寫程式時,在開啟檔案的同時,一般都指定一個指標變數指向該檔案,也就是建立起指標變數與檔案之間的聯絡,這樣就可以通過該指標變數對檔案進行讀寫。
所謂“關閉”:是指撤銷檔案資訊區和檔案緩衝區。
C語言規定了標準輸入輸出函式庫,用fopen()函式開啟一個檔案,用fclose()函式關閉一個檔案。
檔案開啟函式——fopen()
函式原型:FILE *fopen("檔名","操作方式");
功能:返回一個指向指定檔案的FILE型別指標
FILE *fp;
fp = fopen("a.txt", "r");
複製程式碼
說明:
“檔名”是指要開啟(或建立)的檔名,可以使用字元陣列(或字元指標);
檔案關閉函式——fclose()
函式原型:int fclose(FILE *檔案指標);
功能:關閉“檔案指標”所指向的檔案。如果正常關閉了檔案,則函式返回值為0;否則,返回值為非0,fclose(fp);
如果不關閉檔案,可能會丟失資料。
原因是:向檔案中寫資料時,是先將資料輸出到緩衝區,等緩衝區滿後才輸出給檔案。如果當資料未充滿緩衝區而程式結束執行,就會將緩衝區中的資料丟失。使用fclose()關閉檔案,它先把緩衝區中的資料輸出到磁碟檔案,然後才釋放檔案指標變數。
順序讀寫資料檔案
對順序讀寫來說,對檔案讀寫資料的順序和資料在檔案中的物理順序是一致的,也就是說,位於前面的資料先讀寫,位於後面的資料後讀寫;
順序讀寫需要用庫函式實現,它們由stdio.h檔案宣告:
單字元讀寫函式: fgetc()和fputc()
字串讀寫函式: fgets()和fputs()
資料塊讀寫函式: fread()和fwrite()
格式化讀寫函式: fscanf()和fprintf()
複製程式碼
編寫檔案操作程式的步驟
可分為以下幾步:
1、定義檔案型別指標;
2、開啟檔案,並判斷是否成功開啟,若開啟檔案失敗,程式退出執行狀態;
3、對檔案進行讀寫等操作;
4、關閉檔案。
讀寫一個字元的函式——fputc()與fgetc()
寫字元函式——fputc()
函式原型:int fputc(char ch,FILE *fp);
函式功能:把一字元ch寫入fp指向的檔案中
返回值:正常,返回ch; 出錯,為EOF( - 1)
讀字元函式——fgetc()
函式原型:int fgetc(FILE *fp);
函式功能:從fp指向的檔案中讀取一字元, 通常存放到一個變數中
返回值:正常,返回讀取的字元; 出錯,為EOF( - 1)
讀寫字串的函式——fputs()與fgets()
寫字串函式——fputs()
函式原型:int fputs(char *buf, FILE *fp);
其中:buf可以是字串常量、字元陣列名或字元指標函式功能:將buf指向的字串寫到fp指定的檔案。但不輸出字串結束符‘\0’
返回值:寫成功,返回所寫的最後一個字元,否則返回EOF值
讀字串函式——fgets()
函式原型:char *fgets(char *buf, int n, FILE *fp); 函式功能:從fp指定的檔案讀取長度為n - 1的字串存入起始地址為buf的記憶體空間,自動加結束標誌‘\0’,共佔n個字元,返回值為地址buf。若在未讀足n - 1個字元前遇到換行符‘\n’或檔案結束就停止讀取。 返回值:正常,返回地址buf;若讀到檔案末尾或出錯,則返回NULL值
void main(){
char* path = "D:\\mytxt.txt";
//開啟
FILE *fp = fopen(path,"r");
if (fp == NULL){
printf("檔案開啟失敗...");
return;
}
//讀取
char buff[50];//緩衝
while (fgets(buff,50,fp))
{
printf("%s", buff);
}
//關閉
fclose(fp);
}
複製程式碼
void main(){
char* path = "D:\\mytxt.txt";
//開啟
FILE *fp = fopen(path,"w");
if (fp == NULL){
printf("檔案開啟失敗...");
return;
}
char *text = "我是誰並不重要,重要的是你需要我";
fputs(text, fp);
//關閉
fclose(fp);
getchar();
}
複製程式碼
計算機的檔案儲存在物理上都是二進位制
文字檔案和二進位制之分,其實是一個邏輯之分
C讀寫文字檔案與二進位制檔案的差別僅僅體現在回車換行符
寫文字時,每遇到一個'\n',會將其轉換成'\r\n'(回車換行)
讀文字時,每遇到一個'\r\n',會將其轉換成'\n'
複製檔案
void main(){
char *read_path = "D:\\timg.jpg";
char *write_path = "D:\\timg_new.jpg";
//讀的檔案 b字元表示操作二進位制檔案binary
FILE *read_fp = fopen(read_path, "rb");
//寫的檔案
FILE *write_fp = fopen(write_path, "wb");
//複製
int buff[50]; //緩衝區域
int len = 0; //每次讀到的資料長度
while ((len = fread(buff, sizeof(int), 50, read_fp)) != 0){
//將讀到的內容寫入新的檔案
fwrite(buff, sizeof(int), len, write_fp);
}
//關閉流
fclose(read_fp);
fclose(write_fp);
getchar();
}
複製程式碼
獲取檔案大小
void main(){
char *read_path = "D:\\timg.jpg";
FILE *fp = fopen(read_path, "r");
//重新定位檔案指標
//SEEK_END檔案末尾,0偏移量
fseek(fp, 0, SEEK_END);
//返回當前的檔案指標,相對於檔案開頭的位移量
long filesize = ftell(fp);
printf("%d\n", filesize);
getchar();
}
複製程式碼