C語(yǔ)言輸入輸出函數(shù)有很多,標(biāo)準(zhǔn)I/O函數(shù)中包含了如下幾個(gè)常用的函數(shù):
成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)蘇州,十多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢建站服務(wù):18980820575
scanf,printf,getc,putc,getchar,putchar,gets,puts,fgets,fputs,fgetc,fputc,fscanf,fprintf等.
int scanf(const char *format, arg_list)
scanf主要從標(biāo)準(zhǔn)輸入流中獲取參數(shù)值,format為指定的參數(shù)格式及參數(shù)類(lèi)型,如scanf("%s,%d",str,icount);
它要求在標(biāo)準(zhǔn)輸入流中輸入類(lèi)似"son of bitch,1000"這樣的字符串,同時(shí)程序會(huì)將"son of bitch"給str,1000給icount.
scanf函數(shù)的返回值為int值,即成功賦值的個(gè)數(shù),在上例中如果函數(shù)調(diào)用成功,則會(huì)返回2,所以我們?cè)趯?xiě)程序時(shí),可以通過(guò)
語(yǔ)句if(scanf("%s,%d",str,icount) != 2){...}來(lái)判斷用戶輸入是否正確.
int printf(const char *format, arg_list)
printf主要是將格式化字符串輸出到標(biāo)準(zhǔn)輸出流中,在stdio.h頭文件中定義了標(biāo)準(zhǔn)的輸入和輸出,分別是stdin,stdout.
arg_list可以是變量名,也可以是表達(dá)式,但最終都會(huì)以值的形式填充進(jìn)format中.
int getc(FILE *fp)
getc主要是從文件中讀出一個(gè)字符.常用的判斷文件是否讀取結(jié)束的語(yǔ)句為:(ch = getc(fp)) != EOF.EOF為文件結(jié)束標(biāo)志,
定義在stdio.h中,就像EXIT_SUCCESS,EXIT_FAILURE定義在stdlib.h中一樣,文件也可以被理解為一種流,所以當(dāng)fp為stdin
時(shí),getc(stdin)就等同于getchar()了.
int putc(int ch,FILE *fp)
putc主要是把字符ch寫(xiě)到文件fp中去.如果fp為stdout,則putc就等同于putchar()了.
int getchar(void)
getchar主要是從標(biāo)準(zhǔn)輸入流讀取一個(gè)字符.默認(rèn)的標(biāo)準(zhǔn)輸入流即stdio.h中定義的stdin.但是從輸入流中讀取字符時(shí)又
涉及到緩沖的問(wèn)題,所以并不是在屏幕中敲上一個(gè)字符程序就會(huì)運(yùn)行,一般是通過(guò)在屏幕上敲上回車(chē)鍵,然后將回車(chē)前的字符
串放在緩沖區(qū)中,getchar就是在緩沖區(qū)中一個(gè)一個(gè)的讀字符.當(dāng)然也可以在while循環(huán)中指定終止字符,如下面的語(yǔ)句:
while ((c = getchar()) != '#')這是以#來(lái)結(jié)束的.
int putchar(int ch)
putchar(ch)主要是把字符ch寫(xiě)到標(biāo)準(zhǔn)流stdout中去.
char * gets(char *str)
gets主要是從標(biāo)準(zhǔn)輸入流讀取字符串并回顯,讀到換行符時(shí)退出,并會(huì)將換行符省去.
int puts(char *str)
puts主要是把字符串str寫(xiě)到標(biāo)準(zhǔn)流stdout中去,并會(huì)在輸出到最后時(shí)添加一個(gè)換行符.
char *fgets(char *str, int num, FILE *fp)
str是存放讀入的字符數(shù)組指針,num是最大允許的讀入字符數(shù),fp是文件指針.fgets的功能是讀一行字符,該行的字符數(shù)
不大于num-1.因?yàn)閒gets函數(shù)會(huì)在末尾加上一個(gè)空字符以構(gòu)成一個(gè)字符串.另外fgets在讀取到換行符后不會(huì)將其省略.
int fputs(char *str, file *fp)
fputs將str寫(xiě)入fp.fputs與puts的不同之處是fputs在打印時(shí)并不添加換行符.
int fgetc(FILE *fp)
fgetc從fp的當(dāng)前位置讀取一個(gè)字符.
int fputc(int ch, file *fp)
fputc是將ch寫(xiě)入fp當(dāng)前指定位置.
int fscanf(FILE *fp, char *format,...)
fscanf按照指定格式從文件中出讀出數(shù)據(jù),并賦值到參數(shù)列表中.
int fprintf(FILE *fp, char *format,...)
fprintf將格式化數(shù)據(jù)寫(xiě)入流式文件中.
函數(shù)名稱:寫(xiě)字符文件函數(shù)fputc()
函數(shù)格式:int fputc (int c, File *fp)
參數(shù)解釋?zhuān)篺p為文件指針,它的值是執(zhí)行fopen()打開(kāi)文件時(shí)獲得的。
c為輸出的字符量。
雖然函數(shù)被定義為整型數(shù),但僅用其低八位。
返回值:在正常調(diào)用情況下,函數(shù)返回寫(xiě)入文件的字符的ASCII碼值,出錯(cuò)時(shí),返回EOF(-1)。當(dāng)正確寫(xiě)入一個(gè)字符或一個(gè)字節(jié)的數(shù)據(jù)后,文件內(nèi)部寫(xiě)指針會(huì)自動(dòng)后移一個(gè)字節(jié)的位置。EOF是在頭文件 stdio.h中定義的宏。
FILE 是系統(tǒng)定義的一種結(jié)構(gòu)類(lèi)型的名稱。
FILE *fp; 變量類(lèi)型聲明。聲明 fp 是 FILE型指針,用于指向FILE類(lèi)型 (文件結(jié)構(gòu))。
文件流-- 排成一隊(duì),有先后次序的 輸入(或輸出)一串?dāng)?shù)據(jù),駐留并通過(guò) 輸入輸出緩沖區(qū),進(jìn)出程序。如同水流般地流入或流出。它來(lái)自文件或?qū)懭胛募?/p>
擴(kuò)展資料:
在程序運(yùn)行時(shí),常常需要將一些數(shù)據(jù)(運(yùn)行的最終結(jié)果或中間數(shù)據(jù))輸出到磁盤(pán)上存放起來(lái),以后需要時(shí)再?gòu)拇疟P(pán)中輸入到計(jì)算機(jī)的內(nèi)存。這就要用到磁盤(pán)文件。
C語(yǔ)言將文件看作是一個(gè)字符(字節(jié))的序列,即一個(gè)一個(gè)字符(字節(jié))的數(shù)據(jù)順序組成。根據(jù)數(shù)據(jù)的組成形式,可分為ASCII文件和二進(jìn)制文件。ASCII文件又稱文本(text)文件,它的每一個(gè)字節(jié)可放一個(gè)ASCII碼,代表一個(gè)字符。二進(jìn)制文件是把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式按原樣輸出到磁盤(pán)上存放。
參考資料來(lái)源:百度百科-C文件
C語(yǔ)言文件操作函數(shù)
13.1C語(yǔ)言文件
1,兩種文件存取方式(輸入,輸出方式)
順序存取
直接存取
2,數(shù)據(jù)的兩種存放形式
文本文件
二進(jìn)制文件
13.2文件指針
定義文件類(lèi)型指針變量的一般形式:
FILE *指針變量名;
例如:
FILE *fp1,*fp2;
13.3打開(kāi)文件
在使用文件之前,需打開(kāi)文件.在C里使用fopen函數(shù)打開(kāi)文件.格式為:
fopen(文件名,文件使用方式);
此函數(shù)返回一個(gè)指向FILE類(lèi)型的指針.如:
FILE *fp;
fp=fopen("file_1","r");
如果調(diào)用成功,fp就指向file_1,否則返回為NULL,所以為了保證文件的正確使用,要進(jìn)行測(cè)試.采用如下語(yǔ)句:
If((fp=fopen("file_1","r"))==NULL)
{
printf("Cannot open this file\n");
exit(0);
}
最常用的文件使用方式及其含義如下:
1,"r".為讀而打開(kāi)文本文件.(不存在則出錯(cuò))
2,"rb".為讀而打開(kāi)二進(jìn)制文件.
3,"w".為寫(xiě)而打開(kāi)文本文件.(若不存在則新建,反之,則從文件起始位置寫(xiě),原內(nèi)容將被覆蓋)
4,"wb".為寫(xiě)而打開(kāi)二進(jìn)制文件.
5,"a".為在文件后面添加數(shù)據(jù)而打開(kāi)文本文件.(若不存在,則新建;反之,在原文件后追加)
6,"ab".為在文件后面添加數(shù)據(jù)而打開(kāi)一個(gè)二進(jìn)制文件.
最常用的文件使用方式及其含義如下:
7,"r+".為讀和寫(xiě)而打開(kāi)文本文件.(讀時(shí),從頭開(kāi)始;在寫(xiě)數(shù)據(jù)時(shí),新數(shù)據(jù)只覆蓋所占的空間,其后不變)
8,"rb+".為讀和寫(xiě)而打開(kāi)二進(jìn)制文件.只是在隨后的讀寫(xiě)時(shí),可以由位置函數(shù)設(shè)置讀和寫(xiě)的起始位置.
9,"w+".首先建立一個(gè)新文件,進(jìn)行寫(xiě)操作,隨后可以從頭開(kāi)始讀.(若文件存在,原內(nèi)容將全部消失)
10,"wb+".功能與"w+"同.只是在隨后的讀寫(xiě)時(shí),可以由位置函數(shù)設(shè)置讀和寫(xiě)的起始位置.
最常用的文件使用方式及其含義如下:
11,"a+".功能與"a"相同;只是在文件尾部添加新的數(shù)據(jù)后,可以從頭開(kāi)始讀.
12,"ab+".功能與"a+"相同;只是在文件尾部添加新數(shù)據(jù)之后,可以由位置函數(shù)設(shè)置開(kāi)始讀的起始位置.
13.4關(guān)閉文件
當(dāng)文件的讀寫(xiě)操作完成之后,使用fclose函數(shù)關(guān)閉文件.格式如下:
fclose(文件指針)
如:fclose(fp);
13.5調(diào)用getc(fgetc)和putc(fputc)函數(shù)進(jìn)行輸入和輸出
1,調(diào)用putc(或fputc)函數(shù)輸出一個(gè)字符
調(diào)用形式為:
putc(ch,fp);
功能是:將字符ch寫(xiě)到文件指針fp所指的文件中去.當(dāng)輸出成功,putc函數(shù)返回所輸出的字符;否則,返回一個(gè)EOF值.EOF是在stdio.h庫(kù)函數(shù)文件中定義的符號(hào)常量,其值等于-1.
13.5調(diào)用getc(fgetc)和putc(fputc)函數(shù)進(jìn)行輸入和輸出
例如:把從鍵盤(pán)輸入的文本按原樣輸出到名為file_1.dat文件中,用字符@作為鍵盤(pán)輸入結(jié)束標(biāo)志.
#include
Void main()
{
FILE *fpout;
char ch;
if(fpout=fpopen("file_1","w")==NULL)
{
printf("Cannot open this file!\n");
exit(0);
}
ch=getchar();
while(ch!='@')
{ fputc(ch,fpout); ch=getchar(); }
fclose(fpout);
}
2.調(diào)用getc(或fgetc)函數(shù)輸入一個(gè)字符
調(diào)用形式為:
ch=getc(pf);
功能是:從pf指定的文件中讀如一個(gè)字符,并把它作為函數(shù)值返回.
例如:把一個(gè)已存在磁盤(pán)上的file_1.dat文本文件中的內(nèi)容,原樣輸出到終端屏幕上.
#include
void main(){
FILE *fpin;
char ch;
if((fpin=fopen("file_1.dat","r"))==NULL)
{ printf("Cann't open this file!\n");exit(0);}
ch=fgetc(fpin);
while (ch!=EOF)
{ putchar(ch); ch=fgetc(fpin);}
fclose(fpin);
}
13.6判斷文件結(jié)束函數(shù)feof
EOF可以作為文本文件的結(jié)束 標(biāo)志,但不能作為二進(jìn)制文件的結(jié)束符.feof函數(shù)既可以判斷二進(jìn)制文件,又可以判斷文本文件.
例:編寫(xiě)程序,用于把一個(gè)文本文件(源)復(fù)制到另一個(gè)文件(目的)中,源文件名和目的文件名由命令行輸入.命令形式如下:
可執(zhí)行程序名 源文件名 目的文件名
#include
void filecopy(FILE* ,FILE *);
void main(int argc,char *argv[]){
FILE *fpin,*fpout;
if(argc==3)
{ fpin=fopen(argv[1],"r");
fpout=fopen(argv[2],"w");
filecopy(fpin,fpout);
fclose(fpin);fclose(fpout);
}
else if(argc3)
printf("The file names too many!!\n";
else
printf("There are no file names for input or output!!\n );
}
void filecopy(FILE *fpin,FILE *fpout)
{
char ch;
ch=getc(fpin);
while(!feof(fpin))
{putc(ch,fpout); ch=getc(fpin);}
}
13.7fscanf函數(shù)和fprintf函數(shù)
1,fscanf函數(shù)
fscanf只能從文本文件中按格式輸入,和scanf函數(shù)相似,只不過(guò)輸入的對(duì)象是磁盤(pán)上文本文件中的數(shù)據(jù).調(diào)用形式為:
fscanf(文件指針,格式控制字符串,輸入項(xiàng)表)
例如:fscanf(fp,"%d%d",a,b);
fscanf(stdin,"%d%d",a,b);
等價(jià)于scanf("%d%d",a,b);
3.fprintf函數(shù)
fprintf函數(shù)按格式將內(nèi)存中的數(shù)據(jù)轉(zhuǎn)換成對(duì)應(yīng)的字符,并以ASCII代碼形式輸出到文本文件中.Fprintf函數(shù)和printf函數(shù)相似,只是將輸出的內(nèi)容按格式存放到磁盤(pán)的文本文件中.調(diào)用形式如下:
fprintf(文件指針,格式控制字符串,輸出項(xiàng)表)
如:fprintf(fp,"%d %d",x,y);
以下語(yǔ)句 fprintf(stdout,"%d %d",x,y)
13.8fgets函數(shù)和fputs函數(shù)
1,fgets函數(shù)
fgets函數(shù)用來(lái)從文件中讀入字符串.調(diào)用形式如下:
fgets(str,n,fp);
函數(shù)功能是:從fp所指文件中讀入n-1個(gè)字符放入str為起始地址的空間內(nèi);如果在未讀滿n-1個(gè)字符時(shí),則遇到換行符或一個(gè)EOF結(jié)束本次讀操作,并已str作為函數(shù)值返回.
13.8fgets函數(shù)和fputs函數(shù)
2,fputs函數(shù)
fput函數(shù)把字符串輸出到文件中.函數(shù)調(diào)用形式如下:
fputs(str,fp);
注意:為了便于讀入,在輸出字符串時(shí),應(yīng)當(dāng)人為的加諸如"\n"這樣的字符串.
#include stdio.h
#include iostream
int main(int argc, char *argv[])
{
char arr[10] ;
char *ap = "hello!" ;
FILE *fp ;
if ((fp = fopen("hello.txt", "wt+")) == NULL)
{
printf("error!") ;
exit(1) ;
}
fputs(ap, fp) ;
rewind(fp) ; //
fgets(arr, 10, fp) ;
printf("%s\n", arr) ;
fclose(fp) ;
return 0 ;
}
13.9fread函數(shù)和fwrite函數(shù)
例如有如下結(jié)構(gòu)體:
struct st{
char num[8];
float mk[5];
}pers[30];
以下循環(huán)將把這30個(gè)元素中的數(shù)據(jù)輸出到fp所指文件中.
for(i=0;i30;i++)
fwrite(pers[i],sizeof(struct st),1,fp);
13.9fread函數(shù)和fwrite函數(shù)
以下語(yǔ)句從fp所指的文件中再次將每個(gè)學(xué)生數(shù)據(jù)逐個(gè)讀入到pers數(shù)組中.
i=0;
fread(pers[i],sizeof(struct st),1,fp);
while(!feof(fp))
{ i++;
fread(pers[i],sizeof(struct st),1,fp);
}
13.10文件定位函數(shù)
1,fseek函數(shù)
fseek函數(shù)用來(lái)移動(dòng)文件位置指針到指定的位置上,接著的讀或?qū)懖僮鲗拇宋恢瞄_(kāi)始.函數(shù)的調(diào)用形式如下:
fseek(pf,offset,origin)
pf:文件指針
offset:以字節(jié)為單位的位移量,為長(zhǎng)整形.
origin:是起始點(diǎn),用來(lái)指定位移量是以哪個(gè)位置為基準(zhǔn)的.
1,fseek函數(shù)
位移量的表示方法
標(biāo)識(shí)符 數(shù)字 代表的起始點(diǎn)
SEEK_SET 0 文件開(kāi)始
SEEK_END 2 文件末尾
SEEK_CUR 1 文件當(dāng)前位置
假設(shè)pf已指向一個(gè)二進(jìn)制文件,則;
fseek(pf,30L,SEEK_SET)
fseek(pf,-10L*sizeof(int),SEEK_END)
對(duì)于文本文件,位移量必須是0;如:
fseek(pf,0L,SEEK_SET)
fseek(pf,0L,SEEK_END)
2. ftell函數(shù)
ftell函數(shù)用以獲得文件當(dāng)前位置指針的位置,函數(shù)給出當(dāng)前位置指針相對(duì)于文件開(kāi)頭的字節(jié)數(shù).如;
long t;
t=ftell(pf);
當(dāng)函數(shù)調(diào)用出錯(cuò)時(shí),函數(shù)返回-1L.
我們可以通過(guò)以下方式來(lái)測(cè)試一個(gè)文件的長(zhǎng)度:
fseek(fp,0L,SEEK_END);
t=ftell(fp);
3.rewind函數(shù)
調(diào)用形式為:
rewind(pf);
函數(shù)沒(méi)有返回值.函數(shù)的功能是使文件的位置指針回到文件的開(kāi)頭.
13.10文件應(yīng)用
在磁盤(pán)上的test.txt文件中放有10個(gè)不小于2的正整數(shù),用函數(shù)調(diào)用方式編寫(xiě)程序.要求實(shí)現(xiàn):
1,在被調(diào)函數(shù)prime中,判斷和統(tǒng)計(jì)10個(gè)整數(shù)中的素?cái)?shù)以及個(gè)數(shù).
2,在主函數(shù)中將全部素?cái)?shù)追加到磁盤(pán)文件test.txt的尾部,同時(shí)輸出到屏幕上.
#include
#include
Int prime(int a[],int n)
{
int I,j,k=0,flag=0;
for(i=0;i { for(j=2;j if(a[i]%j==0)
{ flag=0; break;}
else flag=1;
if(flag)
{a[k]=a[i];k++;}
}
return k;
}
void main(){
int n,I,a[10];
FILE *fp;
fp=fopen("test1-2.txt","r+");
for(n=0;n10;n++)
fscanf(fp,"%d",a[n]);
n=prime(a,n);
fseek(fp,o,2);
for(i=0;i {printf("%3d",a[i]);
fprintf(fp,"%3d",a[i]);
}
fclose(fp);
頭文件是一種文本文件,使用文本編輯器將代碼編寫(xiě)好之后,以擴(kuò)展名.h保存就行了。頭文件中一般放一些重復(fù)使用的代碼,例如函數(shù)聲明,變量聲明,常數(shù)定義,宏的定義等等。
當(dāng)使用#include語(yǔ)句將頭文件引用時(shí),相當(dāng)于將頭文件中所有內(nèi)容,復(fù)制到#include處。為了避免因?yàn)橹貜?fù)引用而導(dǎo)致的編譯錯(cuò)誤,頭文件常具有:
#ifndef _DELAY_H_
#define _DELAY_H_
//代碼部分
#endif
的格式。
擴(kuò)展資料
C語(yǔ)言頭文件的作用
在C語(yǔ)言中,頭文件是程序格部分之間保證信息一致性的橋梁,連接程序?qū)ο蠖x和使用的紐帶。
通常開(kāi)發(fā)C程序的程序員會(huì)把一個(gè)程序分為兩類(lèi):以h為擴(kuò)展名的輔助性文件,也稱為頭文件。以.c為擴(kuò)展名的基本程序文件,也稱為源代碼文件;定義好頭文件是保證大型程序開(kāi)發(fā)工作能夠順利進(jìn)行的重要環(huán)節(jié)。
比如幾個(gè)人共同開(kāi)發(fā)一個(gè)大系統(tǒng),他們之間需要有一些約定。 如果一個(gè)人定義的東西唄另一個(gè)人使用,就需要通過(guò)引入對(duì)應(yīng)的頭文件來(lái)建立相互間的聯(lián)系。
在程序開(kāi)發(fā)時(shí),最早成型的可能是一批頭文件,它們形成不同工作者之間的聯(lián)系標(biāo)準(zhǔn)。即使是一個(gè)人, 在采用分塊坊式寫(xiě)程序時(shí)也有類(lèi)似的情況。
不用我做了,看這個(gè)就可以了。
1.2.1 標(biāo)準(zhǔn)文件函數(shù)
標(biāo)準(zhǔn)文件函數(shù)主要包括文件的打開(kāi)、關(guān)閉、讀和寫(xiě)等函數(shù)。不象BASIC 、
FORTRAN語(yǔ)方有順序文件和隨機(jī)文件之分, 在打開(kāi)時(shí)就應(yīng)按不同的方式確定。
Turbo C2.0并不區(qū)分這兩種文件, 但提供了兩組函數(shù), 即順序讀寫(xiě)函數(shù)和隨機(jī)讀
寫(xiě)函數(shù)。
一、文件的打開(kāi)和關(guān)閉
任何一個(gè)文件在使用之前和使用之后, 必須要進(jìn)行打開(kāi)和關(guān)閉, 這是因?yàn)椴?/p>
作系統(tǒng)對(duì)于同時(shí)打開(kāi)的文件數(shù)目是有限制的, DOS操作系統(tǒng)中, 可以在DEVICE
.SYS中定義允許同時(shí)打開(kāi)的文件數(shù)n(用files=n定義)。其中n 為可同時(shí)打開(kāi)的文
件數(shù), 一般n=20。因此在使用文件前應(yīng)打開(kāi)文件, 才可對(duì)其中的信息進(jìn)行存取。
用完之后需要關(guān)閉, 否則將會(huì)出現(xiàn)一些意想不到的錯(cuò)誤。Turbo C2.0提供了打開(kāi)
和關(guān)閉文件的函數(shù)。
1. fopen()函數(shù)
fopen函數(shù)用于打開(kāi)文件, 其調(diào)用格式為:
FILE *fopen(char *filename, *type);
在介紹這個(gè)函數(shù)之;前, 先了解一下下面的知識(shí)。
(1) 流(stream)和文件(file)
流和文件 在Turbo C2.0中是有區(qū)別的, Turbo C2.0 為編程者和被訪問(wèn)的設(shè)
備之間提供了一層抽象的東西, 稱之為"流", 而將具體的實(shí)際設(shè)備叫做文件。
流是一個(gè)邏輯設(shè)備, 具有相同的行為。因此, 用來(lái)進(jìn)行磁盤(pán)文件寫(xiě)的函數(shù)也同樣
可以用來(lái)進(jìn)行打印機(jī)的寫(xiě)入。在Turbo C2.0中有兩種性質(zhì)的流: 文字流( text
stream)和二進(jìn)制(binary stream)。對(duì)磁盤(pán)來(lái)說(shuō)就是文本文件和二進(jìn)制文件。本
軟件為了便于讓讀者易理解Turbo C2.0語(yǔ)言而沒(méi)有對(duì)流和文件作特別區(qū)分。
(2) 文件指針FILE
實(shí)際上FILE是一個(gè)新的數(shù)據(jù)類(lèi)型。它是Turbo C2.0的基本數(shù)據(jù)類(lèi)型的集合,
稱之為結(jié)構(gòu)指針。有關(guān)結(jié)構(gòu)的概念將在第四節(jié)中詳細(xì)介紹, 這里只要將FILE理解
為一個(gè)包括了文件管理有關(guān)信息的數(shù)據(jù)結(jié)構(gòu), 即在打開(kāi)文件時(shí)必須先定義一個(gè)文
件指針。
(3) 以后介紹的函數(shù)調(diào)用格式將直接寫(xiě)出形式參數(shù)的數(shù)據(jù)類(lèi)型和函數(shù)返回值
的數(shù)據(jù)類(lèi)型。例如: 上面打開(kāi)文件的函數(shù), 返回一個(gè)文件指針, 其中形式參數(shù)有
兩個(gè), 均為字符型變量(字符串?dāng)?shù)組或字符串指針)。本軟件不再對(duì)函數(shù)的調(diào)用格
式作詳細(xì)說(shuō)明。
現(xiàn)在再來(lái)看打開(kāi)文件函數(shù)的用法。
fopen()函數(shù)中第一個(gè)形式參數(shù)表示文件名, 可以包含路徑和文件名兩部分。
如:
"B:TEST.DAT"
"C:\\TC\\TEST.DAT"
如果將路徑寫(xiě)成"C:\TC\TEST.DAT"是不正確的, 這一點(diǎn)要特別注意。
第二個(gè)形式參數(shù)表示打開(kāi)文件的類(lèi)型。關(guān)于文件類(lèi)型的規(guī)定參見(jiàn)下表。
表 文件操作類(lèi)型
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
字符 含義
————————————————————————————
"r" 打開(kāi)文字文件只讀
"w" 創(chuàng)建文字文件只寫(xiě)
"a" 增補(bǔ), 如果文件不存在則創(chuàng)建一個(gè)
"r+" 打開(kāi)一個(gè)文字文件讀/寫(xiě)
"w+" 創(chuàng)建一個(gè)文字文件讀/寫(xiě)
"a+" 打開(kāi)或創(chuàng)建一個(gè)文件增補(bǔ)
"b" 二進(jìn)制文件(可以和上面每一項(xiàng)合用)
"t" 文這文件(默認(rèn)項(xiàng))
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
如果要打開(kāi)一個(gè)CCDOS子目錄中, 文件名為CLIB的二進(jìn)制文件, 可寫(xiě)成:
fopen("c:\\ccdos\\clib", "rb");
如果成功的打開(kāi)一個(gè)文件, fopen()函數(shù)返回文件指針, 否則返回空指針
(NULL)。由此可判斷文件打開(kāi)是否成功。
2. fclose()函數(shù)
fclose()函數(shù)用來(lái)關(guān)閉一個(gè)由fopen()函數(shù)打開(kāi)的文件 , 其調(diào)用格式為:
int fclose(FILE *stream);
該函數(shù)返回一個(gè)整型數(shù)。當(dāng)文件關(guān)閉成功時(shí), 返回0, 否則返回一個(gè)非零值。
可以根據(jù)函數(shù)的返回值判斷文件是否關(guān)閉成功。
例10:
#icludestdio.h
main()
{
FILE *fp; /*定義一個(gè)文件指針*/
int i;
fp=fopen("CLIB", "rb"); /*打開(kāi)當(dāng)前目錄名為CLIB的文件只讀*/
if(fp==NULL) /*判斷文件是否打開(kāi)成功*/
puts("File open error");/*提示打開(kāi)不成功*/
i=fclose(fp); /*關(guān)閉打開(kāi)的文件*/
if(i==0) /*判斷文件是否關(guān)閉成功*/
printf("O,K"); /*提示關(guān)閉成功*/
else
puts("File close error");/*提示關(guān)閉不成功*/
}
二、有關(guān)文件操作的函數(shù)
本節(jié)所講的文件讀寫(xiě)函數(shù)均是指順序讀寫(xiě), 即讀寫(xiě)了一條信息后, 指針自動(dòng)
加1。下面分別介紹寫(xiě)操作函數(shù)和讀操作函數(shù)。
1. 文件的順序?qū)懞瘮?shù)
fprintf()、fputs()和fputc()函數(shù)
函數(shù)fprintf()、fputs()和fputc()均為文件的順序?qū)懖僮骱瘮?shù), 其調(diào)用格
式如下:
int fprintf(FILE *stream, char *format, variable-list);
int fputs(char *string, FILE *steam);
int fputc(int ch, FILE *steam);
上述三個(gè)函數(shù)的返回值均為整型量。fprintf() 函數(shù)的返回值為實(shí)際寫(xiě)入文
件中的字罕個(gè)數(shù)(字節(jié)數(shù))。如果寫(xiě)錯(cuò)誤, 則返回一個(gè)負(fù)數(shù), fputs()函數(shù)返回0時(shí)
表明將string指針?biāo)傅淖址畬?xiě)入文件中的操作成功, 返回非0時(shí), 表明寫(xiě)操
作失敗。fputc()函數(shù)返回一個(gè)向文件所寫(xiě)字符的值, 此時(shí)寫(xiě)操作成功, 否則返
回EOF(文件結(jié)束結(jié)束其值為-1, 在stdio.h中定義)表示寫(xiě)操作錯(cuò)誤。
fprintf( ) 函數(shù)中格式化的規(guī)定與printf( ) 函數(shù)相同, 所不同的只是
fprintf()函數(shù)是向文件中寫(xiě)入。而printf()是向屏幕輸出。
下面介紹一個(gè)例子, 運(yùn)行后產(chǎn)后一個(gè)test.dat的文件。
例11:
#includestdio.h
main()
{
char *s="That's good news"); /*定義字符串指針并初始化*/
int i=617; /*定義整型變量并初始化*/
FILE *fp; /*定義文件指針*/
fp=fopne("test.dat", "w"); /*建立一個(gè)文字文件只寫(xiě)*/
fputs("Your score of TOEFLis", fp);/*向所建文件寫(xiě)入一串字符*/
fputc(':', fp); /*向所建文件寫(xiě)冒號(hào):*/
fprintf(fp, "%d\n", i); /*向所建文件寫(xiě)一整型數(shù)*/
fprintf(fp, "%s", s); /*向所建文件寫(xiě)一字符串*/
fclose(fp); /*關(guān)閉文件*/
}
用DOS的TYPE命令顯示TEST.DAT的內(nèi)容如下所示:
屏幕顯示
Your score of TOEFL is: 617
That's good news
2. 文件的順序讀操作函數(shù)
fscanf()、fgets()和fgetc()函數(shù)
函數(shù)fscanf()、fgets()和fgetc()均為文件的順序讀操作函數(shù), 其調(diào)用格式
如下:
int fscanf(FILE *stream, char *format, address-list);
char fgets(char *string, int n, FILE *steam);
int fgetc(FILE *steam);
fscanf()函數(shù)的用法與scanf()函數(shù)相似, 只是它是從文件中讀到信息。
fscanf()函數(shù)的返回值為EOF(即-1), 表明讀錯(cuò)誤, 否則讀數(shù)據(jù)成功。fgets()函
數(shù)從文件中讀取至多n-1個(gè)字符(n用來(lái)指定字符數(shù)), 并把它們放入string指向的
字符串中, 在讀入之后自動(dòng)向字符串未尾加一個(gè)空字符, 讀成功返回string指針,
失敗返回一個(gè)空指針。fgetc()函數(shù)返回文件當(dāng)前位置的一個(gè)字符, 讀錯(cuò)誤時(shí)返
回EOF。
下面程序讀取例11產(chǎn)生的test.dat文件, 并將讀出的結(jié)果顯示在屏幕上。
例12
#includestdio.h
main()
{
char *s, m[20];
int i;
FILE *fp;
fp=fopen("test.dat", "r"); /*打開(kāi)文字文件只讀*/
fgets(s, 24, fp); /*從文件中讀取23個(gè)字符*/
printf("%s", s); /*輸出所讀的字符串*/
fscanf(fp, "%d", i); /*讀取整型數(shù)*/
printf("%d", i); /*輸出所讀整型數(shù)*/
putchar(fgetc(fp)); /*讀取一個(gè)字符同時(shí)輸出*/
fgets(m, 17, fp); /*讀取16個(gè)字符*/
puts(m); /*輸出所讀字符串*/
fclose(fp); /*關(guān)閉文件*/
getch(); /*等待任一鍵*/
}
運(yùn)行后屏幕顯示:
Your score of TOEFL is: 617
That's good news
如果將上例中fscanf(fp, "%d", i)改為fscanf(fp, "%s", m), 再將其后
的輸出語(yǔ)句改為printf("%s", m), 則可得出同樣的結(jié)果。由此可見(jiàn)Turbo C2. 0
中只要是讀文字文件, 則不論是字符還是數(shù)字都將按其ASCII值處理。 另外還要
說(shuō)明的一點(diǎn)就是fscanf()函數(shù)讀到空白符時(shí), 便自動(dòng)結(jié)束, 在使用時(shí)要特別注意。
3. 文件的隨機(jī)讀寫(xiě)
有時(shí)用戶想直接讀取文件中間某處的信息, 若用文件的順序讀寫(xiě)必須從文件
頭開(kāi)始直到要求的文件位置再讀, 這顯然不方便。Turbo C2.0提供了一組文件的
隨機(jī)讀寫(xiě)函數(shù), 即可以將文件位置指針定位在所要求讀寫(xiě)的地方直接讀寫(xiě)。
文件的隨機(jī)讀寫(xiě)函數(shù)如下:
int fseek (FILE *stream, long offset, int fromwhere);
int fread(void *buf, int size, int count, FILE *stream);
int fwrite(void *buf, int size, int count, FILE *stream);
long ftell(FILE *stream);
fseek()函數(shù)的作用是將文件的位置指針設(shè)置到從fromwhere開(kāi)始的第offset
字節(jié)的位置上, 其中fromwhere是下列幾個(gè)宏定義之一:
文件位置指針起始計(jì)算位置fromwhere
━━━━━━━━━━━━━━━━━━━━━━━━━━━
符號(hào)常數(shù) 數(shù)值 含義
———————————————————————————
SEEK_SET 0 從文件開(kāi)頭
SEEK_CUR 1 從文件指針的現(xiàn)行位置
SEEK_END 2 從文件末尾
━━━━━━━━━━━━━━━━━━━━━━━━━━━
offset是指文件位置指針從指定開(kāi)始位置(fromwhere指出的位置)跳過(guò)的字
節(jié)數(shù)。它是一個(gè)長(zhǎng)整型量, 以支持大于64K字節(jié)的文件。fseek()函數(shù)一般用于對(duì)
二進(jìn)制文件進(jìn)行操作。
當(dāng)fseek()函數(shù)返回0時(shí)表明操作成功, 返回非0表示失敗。
下面程序從二進(jìn)制文件test_b.dat中讀取第8個(gè)字節(jié)。
例13:
#includestdio.h
main()
{
FILE *fp;
if((fp=fopen("test_b.dat", "rb"))==NULL)
{
printf("Can't open file");
exit(1);
}
fseek(fp, 8. 1, SEEK_SET);
fgetc(fp);
fclose(fp);
}
fread()函數(shù)是從文件中讀count個(gè)字段, 每個(gè)字段長(zhǎng)度為size個(gè)字節(jié), 并把
它們存放到buf指針?biāo)傅木彌_器中。
fwrite()函數(shù)是把buf指針?biāo)傅木彌_器中, 長(zhǎng)度為size個(gè)字節(jié)的count個(gè)字
段寫(xiě)到stream指向的文件中去。
隨著讀和寫(xiě)字節(jié)數(shù)的增大, 文件位置指示器也增大, 讀多少個(gè)字節(jié), 文件位
置指示器相應(yīng)也跳過(guò)多少個(gè)字節(jié)。讀寫(xiě)完畢函數(shù)返回所讀和所寫(xiě)的字段個(gè)數(shù)。
ftell()函數(shù)返回文件位置指示器的當(dāng)前值, 這個(gè)值是指示器從文件頭開(kāi)始
算起的字節(jié)數(shù), 返回的數(shù)為長(zhǎng)整型數(shù), 當(dāng)返回-1時(shí), 表明出現(xiàn)錯(cuò)誤。
下面程序把一個(gè)浮點(diǎn)數(shù)組以二進(jìn)制方式寫(xiě)入文件test_b.dat中。
例14:
#include stdio.h
main()
{
float f[6]={3.2, -4.34, 25.04, 0.1, 50.56, 80.5};
/*定義浮點(diǎn)數(shù)組并初始化*/
int i;
FILE *fp;
fp=fopen("test_b.dat", "wb"); /*創(chuàng)建一個(gè)二進(jìn)制文件只寫(xiě)*/
fwrite(f, sizeof(float), 6, fp);/*將6個(gè)浮點(diǎn)數(shù)寫(xiě)入文件中*/
fclose(fp); /*關(guān)閉文件*/
}
下面例子從test_b.dat文件中讀100個(gè)整型數(shù), 并把它們放到dat數(shù)組中。
例15:
#include stdio.h
main()
{
FILE *fp;
int dat[100];
fp=fopen("test_b.dat", "rb");/*打開(kāi)一個(gè)二進(jìn)制文件只讀*/
if(fread(dat, sizeof(int), 100, fp)!=100)
/*判斷是否讀了100個(gè)數(shù)*/
{
if(feof(fp))
printf("End of file"); /*不到100個(gè)數(shù)文件結(jié)束*/
else
printf("Read error"); /*讀數(shù)錯(cuò)誤*/
fclose(fp); /*關(guān)閉文件*/
}
注意:
當(dāng)用標(biāo)準(zhǔn)文件函數(shù)對(duì)文件進(jìn)行讀寫(xiě)操作時(shí), 首先將所讀寫(xiě)的內(nèi)容放進(jìn)緩沖區(qū),
即寫(xiě)函數(shù)只對(duì)輸出緩沖區(qū)進(jìn)行操作, 讀函數(shù)只對(duì)輸入緩沖區(qū)進(jìn)行操作。例如向一
個(gè)文件寫(xiě)入內(nèi)容, 所寫(xiě)的內(nèi)容將首先放在輸出緩沖區(qū)中, 直到輸出緩沖區(qū)存滿或
使用fclose()函數(shù)關(guān)閉文件時(shí), 緩沖區(qū)的內(nèi)容才會(huì)寫(xiě)入文件中。若無(wú)fclose()
函數(shù), 則不會(huì)向文件中存入所寫(xiě)的內(nèi)容或?qū)懭氲奈募?nèi)容不全。有一個(gè)對(duì)緩沖區(qū)
進(jìn)行刷新的函數(shù), 即fflush(), 其調(diào)用格式為:
int fflush(FILE *stream);
該函數(shù)將輸出緩沖區(qū)的內(nèi)容實(shí)際寫(xiě)入文件中, 而將輸入緩沖區(qū)的內(nèi)容清除掉。
4. feof()和rewind()函數(shù)
這兩個(gè)函數(shù)的調(diào)用格式為:
int feof(FILE *stream);
int rewind(FILE *stream);
feof()函數(shù)檢測(cè)文件位置指示器是否到達(dá)了文件結(jié)尾, 若是則返回一個(gè)非0
值, 否則返回0。這個(gè)函數(shù)對(duì)二進(jìn)制文件操作特別有用, 因?yàn)槎M(jìn)制文件中, 文
件結(jié)尾標(biāo)志EOF也是一個(gè)合法的二進(jìn)制數(shù), 只簡(jiǎn)單的檢查讀入字符的值來(lái)判斷文
件是否結(jié)束是不行的。如果那樣的話, 可能會(huì)造成文件未結(jié)尾而被認(rèn)為結(jié)尾, 所
以就必須有feof()函數(shù)。
下面的這條語(yǔ)句是常用的判斷文件是否結(jié)束的方法。
while(!feof(fp))
fgetc(fp);
while為循環(huán)語(yǔ)句, 將在下面介紹。
rewind()函數(shù)用于把文件位置指示器移到文件的起點(diǎn)處, 成功時(shí)返回0, 否則, 返回非0值。