文件有不同的類型,在程序設(shè)計中,主要用到兩種文件

包括源程序文件(后綴為.c)、目標(biāo)文件(后綴為.obj)、可執(zhí)行文件(后綴為.exe)等。這種文件的內(nèi)容是程序代碼
數(shù)據(jù)文件常常需要將一些數(shù)據(jù)(運(yùn)行的最終結(jié)果或中間數(shù)據(jù))輸出到磁盤上保存起來,以后需要時再從磁盤中輸入到計算機(jī)內(nèi)存,這就要用到磁盤文件
文件是程序設(shè)計中的一個重要的概念,所謂”文件“一般指存儲在外部介質(zhì)上數(shù)據(jù)的集合
文件由運(yùn)行環(huán)境(即操作系統(tǒng))進(jìn)行統(tǒng)一管理的
C的數(shù)據(jù)文件由一連串的字符(或字節(jié))組成,而不考慮行的界限,兩行數(shù)據(jù)間不會自動加分隔符,對文件的存取是以字符(字節(jié))為單位的。輸入輸出數(shù)據(jù)流的開始和結(jié)束僅受程序控制而不受物理符號(如回車換行符)控制,這就增加了處理的靈活性。這種文件稱為流式文件。
文件名一個文件要有唯一的文件標(biāo)識,以便用戶識別和引用。文件標(biāo)識包括3部分:文件路徑;文件名主干;文件后綴
D:\\CC\temp\file1.dat //表示file1.dat文件存放在D盤中CC目錄下的temp子目錄下面文件標(biāo)識符常被稱為文件名,此時所稱的文件名包括上面的3部分。
文件名主干的命名規(guī)則遵循標(biāo)識符的命名規(guī)則
后綴用來表示文件的性質(zhì),一般不超過3個字母(如:doc)
文件的分類數(shù)據(jù)文件可分為ASCLL文件和二進(jìn)制文件
數(shù)據(jù)在內(nèi)存中是以二進(jìn)制形式存儲的,如果不加轉(zhuǎn)換地輸出到外存,就是二進(jìn)制文件,可以認(rèn)為它就是存儲在內(nèi)存的數(shù)據(jù)的映像,所以也稱之為映像文件。如果要求在外存上以ASCLL代碼形式存儲,則需要在存儲前進(jìn)行轉(zhuǎn)換,ASCLL文件又稱文本文件,每個字節(jié)放一個字符的ASCLL代碼
文件緩存區(qū)所謂文件緩存系統(tǒng)是指系統(tǒng)自動地在內(nèi)存區(qū)為程序中每一個正在使用的文件開辟一個文化緩沖區(qū)。從內(nèi)存向磁盤輸出數(shù)據(jù)必須先送到內(nèi)存中的緩沖區(qū),裝滿緩沖區(qū)后才一起送到磁盤去。如果從磁盤向計算機(jī)讀入數(shù)據(jù),則一次從磁盤文件將一批數(shù)據(jù)輸?shù)絻?nèi)存緩沖區(qū)(充滿緩沖區(qū)),然后再從緩沖區(qū)逐個地將數(shù)據(jù)送到程序數(shù)據(jù)區(qū)(給程序變量)。
文件類型指針緩存文件系統(tǒng)中,關(guān)鍵的概念是“文件類型指針”,簡稱“文件指針”。
定義FILE類型的變量
FILE F1;//定義了一個結(jié)構(gòu)體變量f1,用它存放一個文件的有關(guān)信息定義一個指向文件型數(shù)據(jù)的指針變量
FILE* fp;//定義fp是一個指向FILE類型數(shù)據(jù)的指針變量,可以使fp指向一個文件信息區(qū)(是一個結(jié)構(gòu)體變量),通過該文件信息區(qū)中的信息能夠訪問該文件通常將這種指向文件信息區(qū)的指針變量簡稱為指向文件的指針變量
打開和關(guān)閉文件所謂打開是指為文件建立相應(yīng)的信息區(qū)(用來存放有關(guān)文件的信息)和文件緩沖區(qū)(用來暫時存放輸入輸出的數(shù)據(jù))
所謂關(guān)閉是指撤銷文件信息區(qū)和文件緩沖區(qū),使文件指針變量不再指向該文件,顯然就無法進(jìn)行對文件的讀寫了
用fopen函數(shù)打開數(shù)據(jù)文件fopen 函數(shù)的調(diào)用方式為
fopen(文件名,使用文件方式);
//例如:
fopen("al","r");//表示打開名字為“al”的文件,使用文件方式為“讀入”
//fopen的返回值指向al文件的指針(即al文件信息區(qū)的起始地址)通常將fopen函數(shù)的返回值賦給一個指向文件的指針變量FILE* fp; //定義一個指向文件的指針變量fp
fp=fopen("al","r"); //將fopen函數(shù)的返回值賦給指針變量fp| 文件使用方式 | 含義 | 如果指定的文件不存在 |
|---|---|---|
| “r“(只讀) | 為了輸入數(shù)據(jù),打開一個已存在的文本文件 | 出錯 |
| ”w”(只寫) | 為了輸出數(shù)據(jù),打開一個文本文件 | 建立新文件 |
| “a”(追寫) | 向文本文件添加數(shù)據(jù) | 出錯 |
| “rb”(只讀) | 為了輸入數(shù)據(jù),打開一個二進(jìn)制文件 | 出錯 |
| ”wb”(只寫) | 為了輸出數(shù)據(jù),打開一個二進(jìn)制文件 | 建立新文件 |
| “ab”(追加) | 向二進(jìn)制文件尾添加數(shù)據(jù) | 出錯 |
| “r+”(讀寫) | 為了讀和寫,打開一個文本文件 | 出錯 |
| “w+”(讀寫) | 為了讀和寫,建立一個新的文本文件 | 建立新文件 |
| “a+”(讀寫) | 為了讀和寫,打開一個文本文件 | 出錯 |
| “rb+”(讀寫) | 為了讀和寫,打開一個二進(jìn)制文件 | 出錯 |
| “wb+”(讀寫) | 為了讀和寫,建立一個新的二進(jìn)制文件 | 建立新文件 |
| “ab+”(讀寫) | 為讀寫打開一個二進(jìn)制文件 | 出錯 |
關(guān)閉就是撤銷文件信息區(qū)和文件緩沖區(qū),使文件指針變量不再指向該文件,也就是文件指針變量與文件“掛鉤”,此后不能再通過該指針對原來與其相聯(lián)系的文件進(jìn)行讀寫操作,除非再次打開,使該指針變量重新指向該文件
關(guān)閉文件用fclose函數(shù)。fclose函數(shù)調(diào)用的一般形式為
fclose(文件指針);
//例如:
fclose(fp);前面曾把打開文件(用fopen函數(shù))時函數(shù)返回的指針賦給了fp,現(xiàn)在把fp指向的文件關(guān)閉,此后不再指向該文件
如果不關(guān)閉文件將會丟失數(shù)據(jù),因為,在向文件寫數(shù)據(jù)時,是先將數(shù)據(jù)輸出到緩沖區(qū),待緩沖區(qū)充滿后才正式輸出給文件。如果當(dāng)數(shù)據(jù)未充滿緩沖區(qū)就程序結(jié)束運(yùn)行,就有可能使緩沖區(qū)中的數(shù)據(jù)丟失。要用fclose函數(shù)關(guān)閉文件,先把緩沖區(qū)中的數(shù)據(jù)輸出到磁盤文件,然后才撤銷文件緩沖區(qū)。有的編譯系統(tǒng)在程序結(jié)束前會自動先將緩沖區(qū)中的數(shù)據(jù)寫到文件。從而避免了這個問題,但還是應(yīng)當(dāng)養(yǎng)成在程序終止之前關(guān)閉所有文件的習(xí)慣
fclose函數(shù)也帶回一個值,當(dāng)成功地執(zhí)行了關(guān)閉操作,則返回值為0;否則返回EOF(-1)
順序讀寫數(shù)據(jù)文件 怎樣向文件讀寫字符讀寫一個字符的函數(shù)
| 函數(shù)名 | 調(diào)用形式 | 功能 | 返回值 |
|---|---|---|---|
| fgetc | fgetc(fp) | 從fp指向的文件讀入一個字符 | 讀成功,帶回所讀的字符,失敗則返回文件結(jié)束標(biāo)志EOF(-1) |
| fputc | fputc(ch,fp) | 把字符ch寫到文件指針變量fp所指的文件中 | 輸出成功,返回值就是輸出的字符;輸出失敗,則返回EOF(-1) |
說明:fgetc的第1個字母f代表文件(file),中間的get表示“獲取”,最后一個字母c表示字符(character),fgetc的含義很清楚:文件讀取一個字符。fputc也類似
//從鍵盤輸入一些字符,逐個把它們送到磁盤上去,直到用戶輸入一個"#"為止
//解題思路:用fgetc函數(shù)從鍵盤逐個輸入字符,然后用fputc函數(shù)寫到磁盤文件即可
#include#includeint main()
{FILE* fp;
char ch, filename[10];
printf("請輸入所用的文件名:");
scanf("%s",filename);
if ((fp = fopen(filename,"w")) == NULL) //打開輸出文件并使fp指向此文件
{printf("無法打開此文件\n"); //如果打開時錯誤,就輸出“打不開”的信息
exit(0); //終止循環(huán)
}
ch = getchar(); //用來接受最后輸入的回車符
printf("請輸入一個準(zhǔn)備存儲到磁盤的字符串(以#結(jié)束):");
ch = getchar(); //接收從鍵盤輸入的第一個字符
while (ch != '#') //當(dāng)輸入'#'時結(jié)束循環(huán)
{fputc(ch, fp); //向鍵盤文件出一個字符
putchar(ch); //將輸出的字符顯示在屏幕上
ch = getchar(); //再接受從鍵盤輸入的一個字符
}
fclose(fp); //關(guān)閉文件
putchar(10); //向屏幕輸出一個換行符
return 0;
} //將一個磁盤文件中的信息賦值到另一個磁盤文件中,今要求將上列建立的file.dat文件中的內(nèi)容賦值到另一個磁盤文件file2.dat中
//解題思路:處理此問題的算法是,從file1.dat文件中逐個讀入字符,然后逐個輸出到file2.dat中
#include#includeint main()
{FILE* in, * out; //定義指向FILE類型文件的指針變量
char ch, infile[10], outfile[10];//定義兩個字符數(shù)組,分別存放兩個數(shù)據(jù)文件名
printf("輸入讀入文件的名字:");
scanf("%s", infile);//輸入一個輸入文件的名字
printf("輸人輸出文件的名字:");
scanf("%s", outfile);//輸入一個輸出文件的名字
if ((in = fopen(infile, "r")) == NULL)//打開輸入文件
{printf("無法打開此文件\n");
exit(0);
}
if ((out = fopen(outfile, "w")) == NULL)//打開輸出文件
{printf("無法打開此文件\n");
exit(0);
}
while (!feof(in))//如果未遇到輸入文件的結(jié)束標(biāo)志
{ch = fgetc(in);//從輸入文件讀入一個字符,暫放在變量ch中
fputc(ch, out);//從ch寫到輸出屏幕上
putchar(ch);//將ch顯示在屏幕上
}
putchar(10);//顯示完全部字符后換行
fclose(in);//關(guān)閉輸入文件
fclose(out);//關(guān)閉輸出文件
return 0;
} 讀寫一個字符串的函數(shù)
| 函數(shù)名 | 調(diào)用形式 | 功能 | 返回值 |
|---|---|---|---|
| fgets | fgets(str,n,fp) | 從fp指向的文件讀入一個長度為(n-1)的字符串,存放到字符數(shù)組str中 | 讀成功,返回地址str,失敗則返回NULL |
| fputs | fputs(str,fp) | 把str所指向的字符串寫到文件指針變量fp所指向的文件中 | 輸出成功,返回0;否則返回非0值 |
fgets中最后一個字符s表示字符串(string)。fgets的含義是從文件讀取一個字符串
說明:
fgets函數(shù)的函數(shù)原型為
char *fgets(char *str,int n,FILE *fp)//其作用是從文件讀入一個字符串,
//調(diào)用時可寫成
fgets(str,n,fp);//實際上只從fp所指向的文件讀入n-1個字符,然后在最后加'\0'字符fputs函數(shù)的函數(shù)原型為
int fputs(char *str,FILE fp);//其作用是將str所指向的字符串輸出到fp所指向的文件中
//調(diào)用時可寫成
fputs("china",fp);//字符串末尾'\0'不輸出,第一個參數(shù)可以是字符串常量、字符數(shù)組名或字符型指針fgets和fputs這兩個函數(shù)的功能類似于gets和puts函數(shù),只是gets和puts以中終端為讀寫對象,而fgets和fputs函數(shù)以指定的文件作為讀寫對象
用格式化的方式讀寫文件fprintf和fscanf函數(shù)
fprintf(文件指針,格式字符串,輸出表列);
fscanf(文件指針,格式字符串,輸入表列);
//例如:
fprintf(fp,"%d,%6.2f",i,f);//它的作用是將int型變量i和float變量f的值按%d和%6.2f的格式輸出到fp指向的文件中用二進(jìn)制方式向文件讀寫一組數(shù)據(jù)一般調(diào)用形式
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);fread(f,4,10,fp);//f是一個float類型數(shù)組名(代表數(shù)組首元素地址)這個函數(shù)從fp所指向的文件讀入10個4個字節(jié)的數(shù)據(jù),存儲到數(shù)組f中隨機(jī)讀寫數(shù)據(jù)文件
文件位置標(biāo)記及其定位
文件位置標(biāo)記為了對讀寫進(jìn)行控制,系統(tǒng)為每個文件設(shè)置了一個文件讀寫位置標(biāo)記(簡稱文件位置標(biāo)記或文件標(biāo)記),用來指示接下來要讀寫的下一個字符的位置
如果是順序讀文件,則每寫完一個數(shù)據(jù)后,文件位置標(biāo)記順序向后移一個位置,然后在下一個執(zhí)行寫操作時把數(shù)據(jù)寫入指針?biāo)傅奈恢谩V钡桨讶繑?shù)據(jù)寫完,此時文件位置標(biāo)記在最后一次數(shù)據(jù)之后
可以根據(jù)讀寫的需求,人為地移動文件位置標(biāo)記的位置。文件位置標(biāo)記可以向前移、向后移,移到文件頭或文件尾,然后對該位置進(jìn)行讀寫,顯然這不是順序讀寫了,而是隨機(jī)讀寫
文件位置標(biāo)記的定位用rewind函數(shù)使文件位置標(biāo)記指向文件開頭
rewind函數(shù)的作用是使文件位置標(biāo)記重新返回文件的開頭,此函數(shù)沒有返回值
fseek函數(shù)改變文件位置標(biāo)記
fseek函數(shù)的調(diào)用形式為
fseek(文件類型指針,位移量,起始點)//起始點用0、1、2代替,0代表文件開始位置,1為當(dāng)前位置,2為文件末尾位置位移量指開始點為基點,向前移動的字節(jié)數(shù),位移量應(yīng)是long型數(shù)據(jù)(在數(shù)字的末尾加一個字母L,就表示是long型)
//fseek函數(shù)一般用于二進(jìn)制文件
fseek(fp,100L,0); //將文件位置標(biāo)記向前移到離文件開頭100個字節(jié)處
fseek(fp,50L,1); //將文件位置標(biāo)記向前移到離當(dāng)前位置50個字節(jié)處
fseek(fp,-10L,2); //將文件位置標(biāo)記從文件末尾處向后退10個字節(jié)用ftell函數(shù)測定文件位置標(biāo)記的當(dāng)前位置
ftell函數(shù)的作用是得到流式文件中文件位置標(biāo)記的當(dāng)前位置
由于文件中的文件位置標(biāo)記經(jīng)常移動,人們往往不容易知道其當(dāng)前位置,所以常用ftell函數(shù)得到當(dāng)前位置,用相對于文件開頭的位移量來表示。如果調(diào)傭函數(shù)時出錯(如不存在fp指向的文件),ftell函數(shù)返回值為-1L
i=ftell(fp);//變量i存放文件當(dāng)前位置
if(i==-1L)printf("error\n");//如果調(diào)用函數(shù)時出錯,輸出"error"
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前標(biāo)題:專升本C語言——第十章-創(chuàng)新互聯(lián)
文章分享:http://chinadenli.net/article42/ceghhc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、網(wǎng)站導(dǎo)航、定制開發(fā)、Google、網(wǎng)站改版、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容