一、 C語(yǔ)言文件的操作
創(chuàng)新互聯(lián)從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元海曙做網(wǎng)站,已為上家服務(wù),為海曙各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575
1、 文件操作的基本方法:
C語(yǔ)言將計(jì)算機(jī)的輸入輸出設(shè)備都看作是文件。例如,鍵盤文件、屏幕文件等.
向屏幕輸出一個(gè)信息,例如“Hello”是
#include.h>
int main()
{
printf("Hello\\n");
}
從鍵盤接收一個(gè)字符串然后顯示是
#include.h>
int main()
{
char a[10];
scanf("%s",&a);
printf("%s \\n",a);
}
那么,如果寫一個(gè)字符串到一個(gè)文件中,是什么方式呢?顯示到屏幕上是默認(rèn)的輸出文件,如果是硬盤中的一個(gè)文件,首先要打開一個(gè)文件,然后才能往里寫,那么就要告訴程序這個(gè)文件在什么地方,按照什么樣的方式打開(讀、寫、讀和寫、添加、覆蓋等),然后打開后要給這個(gè)打開的文件一個(gè)符號(hào)(指針變量),表示后續(xù)的讀和寫都是針對(duì)這個(gè)文件的,而不是到屏幕的,這個(gè)指針變量以后就代表了文件自身了。
定義一個(gè)代表文件的符號(hào)(指針變量)這樣的形式
FILE *fp;
其中FILE是固定的寫法,后面的是指針變量名,可以隨意起。
這個(gè)時(shí)候fp還是一個(gè)空的指針變量,什么也沒(méi)有代表,類似一個(gè)倉(cāng)庫(kù)里的貨架的標(biāo)簽,什么也沒(méi)有寫。
然后讓這個(gè)指針變量指向一個(gè)文件,就是打開一個(gè)文件,然后讓這個(gè)指針變量指向這個(gè)打開的文件,后續(xù)對(duì)這個(gè)指針變量的操作就都是對(duì)這個(gè)文件的操作了。
打開文件的語(yǔ)句是
fopen(文件位置,打開模式);
文件位置好理解,就是文件所在的位置,例如c://test.txt
打開模式有幾種,
r(read): 讀
w(write): 寫
a(append): 追加
t(text): 文本文件,可省略不寫
b(banary): 二進(jìn)制文件
+: 讀和寫
一般是rt+,也可以寫成r+,和w+,就是讀和寫,能保留原來(lái)的內(nèi)容。
所以打開C盤下my目錄中的文件c:\\my\\test.txt的語(yǔ)句是
fp=fopen("c://my/test.txt","r+");
注意文件夾符號(hào)同上面的不同。
這個(gè)時(shí)候如果打開的文件出問(wèn)題的話,往一個(gè)空指針里面寫東西是比較危險(xiǎn)的,很容易把系統(tǒng)弄崩潰了。所以在后續(xù)的讀寫操作前,最好測(cè)試一下,打開文件后這個(gè)文件指針fp是否還是空的,如果是空的話,就不能往下執(zhí)行了。所以語(yǔ)句變成了這樣
if((fp=fopen(" c://my/test.txt ","r+")) == NULL)
{
printf("文件沒(méi)有正確打開,不能往下執(zhí)行了. \\n");
exit(1);
}
完整的程序成了這樣
#include.h>
int main()
{
FILE *fp;
if((fp=fopen("c://my/test.txt","r+"))==NULL)
{
printf("文件沒(méi)有正確打開,不能往下執(zhí)行了. \\n");
return(1);
}
}
你會(huì)看到,程序報(bào)錯(cuò),因?yàn)闆](méi)有my這個(gè)目錄,所以你要在C盤下先建立一個(gè)my目錄,然后建立一個(gè)test.txt文件?;蛘吣愦蜷_方式選擇寫和讀,如果沒(méi)有目錄或者文件的話,程序會(huì)自動(dòng)幫你建一個(gè)文件。就是這樣
if((fp=fopen("c://my/test.txt","w+"))==NULL)
有時(shí)間自己可以百度一下C語(yǔ)言打開文件的類型,功能非常豐富。
然后就可以用前面的輸入和輸出語(yǔ)句,向文件中寫內(nèi)容了,同咱們上學(xué)期學(xué)的是一致的,就是在printf和scanf前面加f,成為fprint和fscanf,表示向文件輸出和從文件輸入,不是向屏幕輸出和從鍵盤輸入。
下面的程序?qū)崿F(xiàn)了從鍵盤輸入一個(gè)字符,然后寫到文件中。
#include.h>
int main()
{
char a[20];
char b[20];
printf("請(qǐng)輸入一個(gè)字符串(小于20個(gè)字符),寫到c://my/test.txt中 \\n");
scanf("%s",&a);
FILE *fp;
if((fp=fopen("c://my/test.txt","w+"))==NULL)
{
printf("文件沒(méi)有正確打開,不能往下執(zhí)行了. \\n");
return(1);
}
fprintf(fp,"%s",a);
fclose(fp);
}
執(zhí)行完后,你打開文件看看,你寫的字符是否寫進(jìn)去了?
然后,你在記事本中在文件中寫一個(gè)字符串,例如你的名字,然后用fscanf讀出來(lái),而不用在屏幕上輸入了。
#include.h>
int main()
{
char a[20];
FILE *fp;
if((fp=fopen("c://my/test.txt","r+"))==NULL)
{
printf("文件沒(méi)有正確打開,不能往下執(zhí)行了. \\n");
return(1);
}
fscanf(fp,"%s",&a);
printf("%s \\n",a);
fclose(fp);
}
讀取文件的時(shí)候有個(gè)指針,保證按照順序依次往下讀,如果讀到頭了想從頭再來(lái),類似看書一頁(yè)頁(yè)讀完了想到頭上重新操作,用函數(shù)rewind(fp)就可以了,如果想定位到某個(gè)位置,類似將書翻到某一頁(yè),用fseek(fp,偏移量,基準(zhǔn)),就是在基準(zhǔn)(0代表文件頭,1代表當(dāng)前位置,2代表文件尾)的基礎(chǔ)上便宜多少。
這就是基本的文件的讀寫語(yǔ)句。有了文件的讀寫后,才能進(jìn)行管理系統(tǒng)的開發(fā),因?yàn)槟愕暮芏嘈畔⒁娣诺轿募胁判?,否則在程序中,關(guān)機(jī)后數(shù)據(jù)就沒(méi)有了。
2、 能存儲(chǔ)多個(gè)信息的結(jié)構(gòu)體和結(jié)構(gòu)體變量
上學(xué)期學(xué)過(guò),一個(gè)變量可以保存一個(gè)數(shù)據(jù),例如
int a; double b; char c[20];
則a可以保存一個(gè)整數(shù),b可以保存一個(gè)實(shí)數(shù),c可以保存一串字符(字符串)。
但是如果一個(gè)系統(tǒng)中,例如學(xué)生信息管理系統(tǒng)中,需要同時(shí)保存一個(gè)學(xué)生的姓名,性別,年齡等信息,那么設(shè)置變量保存很多同學(xué)的這些信息就有點(diǎn)不太方便。類似一個(gè)登記本,每一頁(yè)只能寫名字,如果你要登記其他的信息,又要添加一個(gè)登記本,只能寫性別,如果登記年齡,又要添加一個(gè)登記本,只能寫年齡,….,多么的不方便,還容易混亂。解決的方法你一定想,多么簡(jiǎn)單,一個(gè)登記本一頁(yè)中,同時(shí)寫姓名,性別,年齡不就行了嗎?C語(yǔ)言也是這樣,如果定義一種形式,一個(gè)變量同時(shí)記錄很多的信息,這樣在管理系統(tǒng)中,就方便很多了。這就是結(jié)構(gòu)體。
結(jié)構(gòu)體首先要定義,因?yàn)槊總€(gè)程序用到的組合在一起的信息不一樣,例如學(xué)生信息管理系統(tǒng)中,可能要將學(xué)號(hào)、姓名、性別、年齡、班級(jí)組合到一起,所以 第一行用struct告訴程序,下面是一個(gè)結(jié)構(gòu)體,后面的stu是這個(gè)結(jié)構(gòu)體的類型,類似整數(shù)用int表示,這個(gè)stu是你自己起的名字。
typedef stu
{ int num;/*學(xué)號(hào)*/
char name[20];/*姓名*/
char sex[5];/*性別*/
int age;/*年齡*/
char sclass[20];/*班級(jí)*/
};
這個(gè)結(jié)構(gòu)體中,包括了5個(gè)變量。
這樣就有了一個(gè)新的變量類型,stu,這個(gè)變量類型是你自己定義的,同int,float是一樣的。
如果定義一個(gè)整數(shù)變量a,你一定知道是
int a;
a=3;
那個(gè)定義一個(gè)你自己定義的stu類型的變量a,這樣的形式,其中前面的struct告訴編譯程序,這個(gè)stu是你自己定義的結(jié)構(gòu)體類型,后面的a就是一個(gè)結(jié)構(gòu)體變量了。
struct stu a;
但是賦值的時(shí)候,因?yàn)檫@個(gè)時(shí)候的a,代表了很多的信息,有num,name,sex,class,就是a中實(shí)際上是包括了很多的變量,那么怎么賦值呢?用點(diǎn)運(yùn)算符”.”,就是a.num,a.name,a.sex,a.class,這個(gè)道理類似剛才提到的記錄本每一頁(yè)記錄很多信息,這個(gè)a就代表1頁(yè)紙,里面有很多信息欄,這一頁(yè)紙的學(xué)號(hào)欄就用a.num表示,其他類似。如果有很多學(xué)生怎么辦呢?那就多設(shè)置幾個(gè)stu類型的變量,例如a1,a2,a3…就行放很多同學(xué)的信息,你一定想到,這不是一個(gè)好辦法,因?yàn)樾畔⒍家粯?,有就是登記本每一?yè)的格式都是一樣的,這種方式適合用數(shù)組,
stu a[80];
這樣,分別用a[0],a[1],a[2],…就可以存放至多到80個(gè)同學(xué)的信息了。
所以程序可以這樣
#include.h>
struct stu
{ int num; /*學(xué)號(hào)*/
char name[20];/*姓名*/
char sex[5];/*性別*/
int age;/*年齡*/
char sclass[20];/*班級(jí)*/
};
int main()
{
struct stu a;
printf("依次輸入學(xué)號(hào),姓名,性別,年齡,班級(jí),用回車分割,系統(tǒng)會(huì)顯示輸入的內(nèi)容 \\n");
scanf("%d%s%s%d%s",&a.num,&a.name,&a.sex,&a.age,&a.sclass);
printf("以下是剛才輸入的信息保存到stu類型變量a中后的結(jié)果 \\n");
printf("%d%s%s%d%s",&a.num,&a.name,&a.sex,&a.age,&a.sclass);
}
現(xiàn)在你已經(jīng)很有進(jìn)步了,可以用一個(gè)變量存儲(chǔ)很多信息了。