C語言的檔案操作

來源:互聯網
上載者:User


13.1C語言檔案
1,兩種檔案存取方式(輸入,輸出方式)
順序存取
直接存取
2,資料的兩種存放形式
文字檔
二進位檔案 13.2檔案指標
定義檔案類型指標變數的一般形式:
FILE *指標變數名;
例如:
FILE *fp1,*fp2; 13.3開啟檔案
在使用檔案之前,需開啟檔案.在C裡使用fopen函數開啟檔案.格式為:
fopen(檔案名稱,檔案使用方式);
此函數返回一個指向FILE類型的指標.如:
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+"相同;只是在檔案尾部添加新資料之後,可以由位置函數設定開始讀的起始位置. 13.4關閉檔案當檔案的讀寫操作完成之後,使用fclose函數關閉檔案.格式如下:
fclose(檔案指標)
如:fclose(fp);
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作為函數值返回.
13.8fgets函數和fputs函數
2,fputs函數
fput函數把字串輸出到檔案中.函數調用形式如下:
fputs(str,fp);
注意:為了便於讀入,在輸出字串時,應當人為的加諸如"\n"這樣的字串. 13.9fread函數和fwrite函數
fread and fwrite函數用來讀,寫二進位檔案.它們的調用形式如下:
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
buffer:要輸入或輸出的資料區塊的首地址
count:每讀寫一次,輸入或輸出資料區塊的個數
size:每個資料區塊的位元組數
fp:檔案指標
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,-10L*sizeof(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(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);
}


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.