常見的文件操做ios
13.1c語言文件數組
1,兩種文件存取方式(輸入,輸出方式)
順序存取
直接存取
2,數據的兩種存放形式
文本文件
二進制文件函數
13.2文件指針
定義文件類型指針變量的通常形式:
FILE *指針變量名;
例如:
FILE *fp1, *fp2;測試
13.3打開文件
在使用文件以前,需打開文件.在C裏使用fopen函數打開文件.格式爲:
fopen(文件名,文件使用方式);
此函數返回一個指向FILE類型的指針.如:this
FILE *fp; fp=fopen("file_1","r");
若是調用成功,fp就指向file_1,不然返回爲NULL,因此爲了保證文件的正確使用,要進行測試.採用以下語句:命令行
If((fp=fopen("file_1","r"))==NULL) { printf("Cannot open this file\n"); exit(0); }
最經常使用的文件使用方式及其含義以下:
1,"r".爲讀而打開文本文件.(不存在則出錯)
2,"rb".爲讀而打開二進制文件.
3,"w".爲寫而打開文本文件.(若不存在則新建,反之,則從文件起始位置寫,原內容將被覆蓋)
4,"wb".爲寫而打開二進制文件.
5,"a".爲在文件後面添加數據而打開文本文件.(若不存在,則新建;反之,在原文件後追加)
6,"ab".爲在文件後面添加數據而打開一個二進制文件.
最經常使用的文件使用方式及其含義以下:
7,"r+".爲讀和寫而打開文本文件.(讀時,從頭開始;在寫數據時,新數據只覆蓋所佔的空間,其後不變)
8,"rb+".爲讀和寫而打開二進制文件.只是在隨後的讀寫時,能夠由位置函數設置讀和寫的起始位置.
9,"w+".首先創建一個新文件,進行寫操做,隨後能夠從頭開始讀.(若文件存在,原內容將所有消失)
10,"wb+".功能與"w+"同.只是在隨後的讀寫時,能夠由位置函數設置讀和寫的起始位置.
最經常使用的文件使用方式及其含義以下:
11,"a+".功能與"a"相同;只是在文件尾部添加新的數據後,能夠從頭開始讀.
12,"ab+".功能與"a+"相同;只是在文件尾部添加新數據以後,能夠由位置函數設置開始讀的起始位置.3d
13.4關閉文件指針
當文件的讀寫操做完成以後,使用fclose函數關閉文件.格式以下:
fclose(文件指針)
如:fclose(fp);code
13.5調用getc(fgetc)和putc(fputc)函數進行輸入和輸出
1,調用putc(或fputc)函數輸出一個字符
調用形式爲:
putc(ch,fp);
功能是:將字符ch寫到文件指針fp所指的文件中去.當輸出成功,putc函數返回所輸出的字符;不然,返回一個EOF值.EOF是在stdio.h庫函數文件中定義的符號常量,其值等於-1.對象
13.5調用getc(fgetc)和putc(fputc)函數進行輸入和輸出
例如:把從鍵盤輸入的文本按原樣輸出到名爲file_1.dat文件中,用字符@做爲鍵盤輸入結束標誌.
#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.調用getc(或fgetc)函數輸入一個字符
調用形式爲:
ch=getc(pf);
功能是:從pf指定的文件中讀如一個字符,並把它做爲函數值返回.
例如:把一個已存在磁盤上的file_1.dat文本文件中的內容,原樣輸出到終端屏幕上.
#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判斷文件結束函數feof
EOF能夠做爲文本文件的結束 標誌,但不能做爲二進制文件的結束符.feof函數既能夠判斷二進制文件,又能夠判斷文本文件.
例:編寫程序,用於把一個文本文件(源)複製到另外一個文件(目的)中,源文件名和目的文件名由命令行輸入.命令形式以下:
可執行程序名 源文件名 目的文件名
#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(argc>3) 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函數和fprintf函數
1,fscanf函數
fscanf只能從文本文件中按格式輸入,和scanf函數類似,只不過輸入的對象是磁盤上文本文件中的數據.調用形式爲:
fscanf(文件指針,格式控制字符串,輸入項表)
例如:
fscanf(fp,"%d%d",&a,&b); fscanf(stdin,"%d%d",&a,&b); 等價於scanf("%d%d",&a,&b);
3.fprintf函數
fprintf函數按格式將內存中的數據轉換成對應的字符,並以ASCII代碼形式輸出到文本文件中.Fprintf函數和printf函數類似,只是將輸出的內容按格式存放到磁盤的文本文件中.調用形式以下:
fprintf(文件指針,格式控制字符串,輸出項表)
如:
fprintf(fp,"%d %d",x,y); 如下語句 fprintf(stdout,"%d %d",x,y)
13.8fgets函數和fputs函數
1,fgets函數
fgets函數用來從文件中讀入字符串.調用形式以下:
fgets(str,n,fp);
函數功能是:從fp**所指文件中讀入n-1個字符放入str爲起始地址的空間內;若是在未讀滿n-1個字符時,則遇到換行符或一個EOF結束本次讀操做,並已str做爲函數值返回.
2,fputs函數
fput函數把字符串輸出到文件中.函數調用形式以下:
fputs(str,fp);
注意:爲了便於讀入,在輸出字符串時,應當人爲的加諸如"\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函數和fwrite函數
例若有以下結構體:
struct st{ char num[8]; float mk[5]; }pers[30];
如下循環將把這30個元素中的數據輸出到fp所指文件中.
for(i=0;i<30;i++) fwrite(&pers[i],sizeof(struct st),1,fp);
13.9fread函數和fwrite函數
如下語句從fp所指的文件中再次將每一個學生數據逐個讀入到pers數組中.
i=0; fread(&pers[i],sizeof(struct st),1,fp); while(!feof(fp)) { i++; fread(&pers[i],sizeof(struct st),1,fp); }
13.10文件定位函數
1,fseek函數
fseek函數用來移動文件位置指針到指定的位置上,接着的讀或寫操做將今後位置開始.函數的調用形式以下:
fseek(pf,offset,origin)
pf:文件指針
offset:以字節爲單位的位移量,爲長整形.
origin:是起始點,用來指定位移量是以哪一個位置爲基準的.
1,fseek函數
位移量的表示方法
標識符 數字 表明的起始點
SEEK_SET 0 文件開始
SEEK_END 2 文件末尾
SEEK_CUR 1 文件當前位置
假設pf已指向一個二進制文件,則;
fseek(pf,30L,SEEK_SET)
fseek(pf,-10Lsizeof(int),SEEK_END)
對於文本文件,位移量必須是0;如:
fseek(pf,0L,SEEK_SET)
fseek(pf,0L,SEEK_END*)
\2. ftell函數
ftell函數用以得到文件當前位置指針的位置,函數給出當前位置指針相對於文件開頭的字節數.如;
long t; t=ftell(pf);
當函數調用出錯時,函數返回-1L.
咱們能夠經過如下方式來測試一個文件的長度:
fseek(fp,0L,SEEK_END); t=ftell(fp);
3.rewind函數
調用形式爲:
rewind(pf);
函數沒有返回值.函數的功能是使文件的位置指針回到文件的開頭.
13.10文件應用
在磁盤上的test.txt文件中放有10個不小於2的正整數,用函數調用方式編寫程序.要求實現:
1,在被調函數prime中,判斷和統計10個整數中的素數以及個數.
2,在主函數中將所有素數追加到磁盤文件test.txt的尾部,同時輸出到屏幕上.
#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;n<10;n++) fscanf(p,"%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); }