C語言中文件的輸入輸出

文件的讀寫

一.fputc函數和fgetc()函數(putc函數和getc()函數)

1.fputc函數

把一個字符寫到磁盤文件上去,調用形式:

fputc(ch,fp);成功輸出字符,失敗EOF(-1)

2.fgetc函數

讀入一個字符,該文件必須是以讀或以讀寫方式打開的

調用形式: ch=fgetc(fp);

while(ch!=EOF)
讀入字符時,遇到結束符EOF(-1),讀取結束,但是有些

二進制數的值正好是-1,就被當作結束符處理,所以提供了

一個feof(fp)來判斷是否結束

二.fread函數和fwrite函數

用來讀取一組數據,調用形式如下:

fread(buffer,size,count,fp);

fwrite(buffer,size,count,fp);

buffer:是一個指針,對於fread來說,它是讀入一個數

據的存放地址,對fwrite來說,是輸出一個數的存放地址

size:要讀寫的字節數

count:要進行讀寫多少個size字節的數據項

三.fprintf和fscanf函數

調用格式:

fprintf(文件指針,格式字符串,輸出表列);

fscanf(文件指針,格式字符串,輸出表列);

用fprintf()和fscanf()函數對磁盤文件的讀寫,使用方

便,容易理解,但是在輸入時要進行ASCII碼轉換到二進制

形式,輸出時將二進制轉換成ASCII碼,花費時間較多,所

以在內存與磁盤頻繁交換的時候,最好不要用這兩個函數

四.fputs和fgets函數

fgets是從指定文件讀入一個字符串

fputs是向指定文件輸入一個字符串

形式如下:

fgets(str,n,fp);

fputs(str,fp);


文件定位

1.rewind函數

使位置指針重新返回文件的開頭,此函數沒有返回值

調用格式:

rewind(fp);

2.fseek函數

可以實現改變文件的位置

fseek(文件類型指針,位移量,起始點);

位移量要求是long型的數據,所以位移數字末尾要加L

文件開始 SEEK_SET 0
文件當前位置 SEEK_CUR 1
文件末尾 SEEK_END 2

如:fseek(fp,100L,0);一般用於二進制文件

3.ftell函數

得到流式文件中當前位置,如果出錯返回-1


出錯檢驗

1.ferror函數

ferror(fp);

在調用輸入輸出函數時,如果出現錯誤,除返回值有反應外

,還可以用ferror函數檢查,ferror返回0表示沒有出錯,

返回非0,表示出錯

每次調用輸入輸出函數都會產生一個新的ferror函數值,素

以每次調用輸入輸出後,立即檢查ferror函數值,否則信息

丟失

在執行fopen函數時,ferror函數初始值自動設置成0

2.clearerr函數

作用是使文件錯誤標誌和文件結束標誌置0

假如調用輸入輸出函數時出錯,調用clearerr(fp)

後,ferror(fp)的值變成0,只要出現錯誤標誌,就一直保留

,直到對同一個文件調用clearerr函數或者rewind函數或熱

河一個輸入輸出函數

下面是一個例子來說明

#include <stdio.h>

struct test {

char stu[20];
int age;
}stu[2],stu1[2];

//fputc的用法
void putcTest() {

FILE *fp;
char ch;

if ((fp=fopen("c:\\1.txt","a")) == NULL) {

printf("file cannot open\n");

return;
}

ch=getchar();

while (ch!='#') {

putc(ch,fp);
putchar(ch);
ch=getchar();
}

fclose(fp);
}

//getc的用法
void getcTest() {

FILE *fp;
char ch;

if ((fp=fopen("c:\\1.txt","r+")) == NULL) {

printf("cannot open file");

return ;
}

ch=getc(fp);

while(!feof(fp)){
putchar(ch);
ch=getc(fp);
}
putchar(10);
fclose(fp);
}

//fwrite和fread的用法


void fwriteread(){
FILE *fp;
int i;
if((fp=fopen("c:\\1.txt","w+"))==NULL){
printf("cannot open file\n");
return;
}
printf("輸入兩個學生的信息形如(cuijiantao,23)\n");
for(i=0;i<2;i++){
///////////////////////////////////////////////////////////////////
//當輸入字符串的時候,後邊要用空格和後邊的隔開,否則會出現不可估量的錯誤
scanf("%s %d",stu[i].stu,&stu[i].age);///////////////////////////////////////
///////////////////////////////////////////////////////////////////////
fwrite(&stu[i],sizeof(test),1,fp);
}

rewind(fp);
for(i=0;i<2;i++){
fread(&stu1[i],sizeof(test),1,fp);
printf("%s %d\n",stu1[i].stu,stu1[i].age);

}
fclose(fp);
}

//fprintf()和fscanf()函數的用法以及fputs() 和fgets()的用法
/////用fprintf()和fscanf()函數對磁盤文件的讀寫,使用方便,容易理解,
//但是在輸入時要進行ASCII碼轉換到二進制形式,輸出時將二進制轉換成ASCII碼,花費時間較多
//所以在內存與磁盤頻繁交換的時候,最好不要用這兩個函數
void printfscanfTest(){
FILE *fp;
int i=3;
int j;
char s[100];
if((fp=fopen("c:\\1.txt","w+"))==NULL){
printf("cannot open file");
}
fputs("sdfasdf",fp);
//fprintf(fp,"%d",i);
rewind(fp);

//fscanf(fp,"%d",&j);
fgets(s,10,fp);
//printf("%d",j);
printf("%s\n",s);
fclose(fp);
}
void main(){
printfscanfTest();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章