C语言:随笔11--文件操作
?文件通常是駐留在外部介質(如磁盤等)上的,在使用時才調入內存中來。
文件的分類:按數據的組織形式:
(1)ASCII文件(文本文件):每一個字節放一個ASCII代碼。
(2)二進制文件:把內存中的數據按其在內存中的存儲形式原樣輸出到磁盤上存放。
例如整數10000D(D表示10進制)在內存中的存儲形式以及分別按照ASCII形式和二進制形式輸出如下圖所示:
ASCII的1對應的十六進制是32H(H表示16進制),十進制是49,二進制是110001。
ASCII文件便于對字符進行逐個處理,也便于輸出字符。但是一般占存儲空間較多,而且要花費轉換時間(因為內存是直接跟CPU交換的,又要用ASCII來存儲,所以二進制必須要有一個轉換為ASCII。(因為CPU只讀二進制))。(比如上邊是一個字符一個字符處理的,把1當作一個字符,0當作一個字符,共四個0分別當作4個字符來處理)?
二進制文件可以節省外存空間和轉換時間,但是一個字節并不對應一個字符,不能直接輸出字符形式(因為要把它轉化為ASCII再來輸出)。(因為我們顯示一個東西出來都是按照ASCII碼顯示的,我們輸入一個東西都是按照ASCII碼形式輸入的,然后它在轉化為二進制)?
緩沖文件系統和非緩沖文件系統。
C語言對文件的讀寫都是通過庫函數(緩沖文件系統)來實現的。
一、文件的打開與關閉
(1)文件型指針變量
FILE *fp;//FILE是一個結構,是一個FILE(文件型)結構。FILE是一個文件的名稱。用這個結構來定義一個指針,這個指針就是指向一個文件。//fp是一個指向FILE類型結構體的指針變量(那么什么是一個FILE類型結構體呢?)。
FILE類型結構體是定義在我們的標準輸入輸出里面頭文件stdio.h,
??
//先定義一個input/outputbuffer(緩沖區)結構,然后再用typedef類型重命名將iobuf這個結構命名為FILE。那么我用FILE來定義一個fp(FILE *fP;)就相當于struct _iobuf *fp;這樣我們的fp指針就指向上邊的結構的。這個指針我們需要往里邊填充類似于這個結構的東西。?
我們使fp指向某一個文件的結構體變量,從而通過該結構體變量中的文件信息能夠訪問該文件。
如果有n個文件,一般應設n個指針變量,使他們分別指向n個文件,以實現對文件的訪問。
怎么使用呢?我們就可以用FILE類型的數組:
FILE f[5];定義了一個結構體數組f,他有5個元素,可以用來存放5個文件的信息。
(1)文件的打開(fopen函數)
//函數調用://定義一個指向FILE結構體的指針fp
FILE *fp;
fp=fopen(文件名,使用文件方式);//將這個指針的值賦予什么呢?用fopen打開,其實用fopen打開他之后它就會填充這個結局體, 然后把他賦給fp,fp指向他。
//注意:(1)需要打開的文件名,也就是準備訪問的文件的名字。(要加上他的路徑是在D盤還是F盤等)
//注意:(2)使用文件的方式(“讀”還是“寫”等)具體的打開方式見下,
//注意:(3)讓哪一個指針變量指向被打開的文件。(我們這里使用的是fp指向,要保證有指向)
文件的使用方式:
“ab”以這種方式的話打開的時候指針就是指向了文件的末尾。
對于文件使用方式有以下說明:
- 凡用“r”打開一個文件時,該文件必須已經存在,且只能從該文件讀出。(如果文件不存在就無法打開,只能返回一個空指針,NULL指針,就指不到地方去了。)
- 用“w”打開文件只能向該文件寫入。若打開的文件不存在,則以指定的文件名建立該文件。若打開的文件已經存在,則該文件刪去,重新建立一個新文件。
- 若要想一個已存在的文件追加新的信息,只能用“a”方式打開文件。但此時該文件必須是存在的,否則將會出錯。
- 在打開一個文件時,如果出錯,fopen將返回一個空指針NULL。在程序中可以用這一信息來判別是否完成打開文件的工作,并作相應的處理。
- 把一個文本文件讀入內存時,要將ASCII碼轉換成二進制碼,而把文件以文本方式寫入磁盤時,也要把二進制碼轉換成ASCII碼,因此文本文件的讀寫要花費較多的轉換時間。對二進制文件的讀寫不存在這種轉換。
示例代碼:
#include<stdio.h>
#include<stdlib.h>
void main()
{FILE *fp;if(!(fp=fopen("F:\\1.txt","rb")))//注意要“\” //b是二進制的形式{printf("Can not open F:\\1 file!\n");system("pause");//讓系統暫停在這,接受用戶的操作}else{printf("Open success!\n");}
}
(2)文件的關閉
文件只要打開了他就要映射到內存上去了,那如果我沒沒有把他給關閉,沒有把這個指針給斷開的話,它會一直占著那個空間。
?
//函數調用:
fclose(文件指針);
//函數功能:使文件指針變量不再指向該文件,也就是文件指針變量與文件“脫鉤”,此后不餓能再通過該指針對原來與其相聯系的文件進行讀寫操作。
//返回值:關閉成功返回值為0;否則返回EOF在C語言中定義為-1.
讀就是把文件的內容讀出來,讀取到緩沖區。寫就是把新的內容寫入文件中。
C中有多種的文件讀寫函數:
//字符讀寫函數:fgetc和fputc//其中f是file的縮寫,c是char的縮寫
//字符串讀寫函數:fgets和fputs 。
//數據塊讀寫函數:freed和fwrite。
//格式化讀寫函數:fscanf和fprintf//就是按照一定的格式,有點像我們的scdnf和printf,前邊加上f表示他是關于文件的。
//以上函數都要包含頭文件stdio.h。
(1)字符輸入輸出函數(fputc()和fgetc())
//fputc()函數調用:
fputc(ch,fp);//fp是一個指針
//函數功能:將字符(ch的值)輸出到fp所指向的文件中去。(比如字符‘a’他的ASCII碼是65,那就把65輸入進去,因為我們是純文本輸入,是輸入ASCII的)
//用寫或者讀寫方式打開一個已存在的文件時將清除原有的文件內容,寫入字符從文件首開始。如需保留原有文件內容,希望寫入的字符以文件末開始存放,必須以追加方式打開文件。被寫入的文件若不存在,則創建該文件。
//每寫入一個字符,文件內部位置指針向后移動一個字節。
//fputc函數有一個返回值,如寫入成功則返回寫入的字符,否則返回一個EOF。可以用來判斷寫入是否成功。//示例文件的寫入:
#include<stdio.h>
#include<stdlib.h>
void main()
{ FILE *fp;//指針fp指向FILE結構,也就是說指針指向的內存它是以FILE結構來讀取的char ch,filename[20];printf("Please input the filename you want to write:");scanf("%s",filename);//filename是數組名表示首地址//表示將要創建的文件的名稱if(!(fp=fopen(filename,"wt+")));//wt+表示讀寫打開或建立一個文本文件,允許讀和寫{//打開錯誤就是返回NULL,那么!NULL就是1,進入if語句,輸出不能打開文件printf("Cannot open the file!\n");exit(0);//終止程序}printf("Please input the sentences you want to write:");ch=getchar();ch=getchar();//有兩個getchar()函數?(如果只寫一個ch=getchar();語句寫入的文件就會在內部的一行出現一個空行?為什么?)while(ch!=EOF)//如果輸入的不是EOF //EOF一般是我們ASCII編碼的文件的結束標志,怎么輸入EOF呢?(EOF輸入是ctl+z組合鍵){fputc(ch,fp);ch=getchar();//再次接收來自鍵盤的輸入,然后繼續循環把他給寫入,直到我們輸入EOF}fclose(fp);//關掉文件
}
//fgetc()函數調用:
ch=fgetc(fp);
//函數功能:其意義是從打開的文件fp中讀取一個字符并送入ch中。
//在fgetc函數調用中,讀取的文件必須是以讀或讀寫方式打開。
//在文件內部有一個位置指針。用來指向文件當前讀寫子節。(因為我們讀取一個之后等一下要讀取第二個,指針要指向第二個你才能讀取,如果一直指向第一個的話你就只能永遠讀取的第一個。所以有一個指針你讀了第一個之后他會自動指向第二個。有一個這樣的機制 )
//在文件打開時,該文件總是指向文件的第一個子節。使用fgetc函數后,該位置指針將向后移動一個字節。因此連續多次使用fgetc函數,讀取多個字符。
//應注意文件指針(FILE *fp)和文件內部的位置指針(是windows系統內部自動匹配自動調用的我們不需要管)不是一回事。
//文件指針是指向整個文件的,須在程序中定義說明,只要不重新賦值,文件指針的值是不變的。
//文件內部的位置指針用以指示文件內部的當前讀寫位置,每讀寫一次,該指針均向后移動,它不需要在程序中定義說明,而是由系統自動設置的。 //示例文件的寫入:
#include<stdio.h>
#include<stdlib.h>
void main()
{ FILE *fp;//指針fp指向FILE結構,也就是說指針指向的內存它是以FILE結構來讀取的char ch,filename[20];printf("Please input the filename you want to write:");scanf("%s",filename);//filename是數組名表示首地址//表示將要創建的文件的名稱if(!(fp=fopen(filename,"r")));{printf("Cannot open the file!\n");exit(0);//終止程序}while(ch!=EOF){ch=fgetc(fp);//讀出的字符保存在ch中putchar(ch);//把ch顯示在屏幕上 }fclose(fp);//關掉文件
}//補充1 :
//從一個文本文件順序讀入字符并顯示在屏幕上。
ch=fgetc(fp);
while(ch!=EOF)
{putchar(ch);ch=fgetc(fp);
}
//注意:EOF不是可輸出字符,因此不能在屏幕上顯示。由于字符的ASCII碼不可能出現-1(ASCII碼是從0開始),因此EOF定義為-1是合適的。當讀入的字符值等于-1時,表示讀入的已不是正常的字符而是文件結束符。
//補充2:
//從一個二進制文件順序讀入字符 ;(就不是-1的問題了,因為二進制文件你想什么數都可以,因為CPU處理的是二進制文件,沒有任何約定,任何數都是二進制文件,那么它就沒有一個EOF我們可以定了,那么我們怎么知道它結束了呢?我們用一個函數feof(),eof就是end of file的縮寫,feof()是文件結束的一個函數)
while(!feof(fp))//feof()函數作用:Tests for end-of-file on a stream.測試是否文件的結尾
{ch=fget(fp);
}
//因此ANSIC提供一個feof()函數來判斷文件是否真的結束。如果文件結束,函數feof(fp)的值為1(真);否則為0(假)。這個也適用于文本文件的讀取。//但是在二進制文件中不能使用EOF(因為二進制文件中有-1這個數)。
編寫一個二進制文件的讀取和寫入:(圖片、文件合成器)
在圖片捆綁了一個可執行文件(.rar)(一個jpg圖片更改后綴名為rar,就會生成一個壓縮文件。將一個jpg圖片加進來一個.rar文件,是兩者的合成版本 )
#include<stdio.h>
#include<stdlib.h>
void main()
{FILE *f_pic,*f_file,*f_finish;//需要三個指針文件,打開兩個,再寫入一個新的char ch,pic_name[20],file_name[20],finish_name[20]; //聲明變量printf("請輸入需要合成的圖片和文件名稱:\n");printf("圖片:");scanf("%s",pic_name);//w文件的名稱是什么?字符串,必須把它把他賦值到一個變量里邊去。//所以上邊要聲明變量printf("文件:");scanf("%s",file_name);printf("生成為:");scanf("%s",finish_name);//打開pic1if(!(f_pic=fopen(pic_name,"rb")))//以二進制讀寫方式打開,并存放在f_pic這個文件指針里{printf("Cannot open the picture %s",pic_name);//打不開return;}//打開file2if(!(f_file=fopen(file_name,"rb")))//以二進制讀寫方式打開,并存放在f_pic這個文件指針里{printf("Cannot open the picture %s",file_name);//打不開return;}//打開3第三個是要寫入的,是原本不存在的,我們新建的。//我們將要生成的if(!(f_finish=fopen(finish_name,"wb")))//以二進制讀寫方式打開,并存放在f_pic這個文件指針里{printf("Cannot open the file %s",finish_name);//打不開 return;}//先把打開的1讀出來然后寫進3。寫完之后再把2的內容寫進3.//我們要寫一個文件,必須要判斷文件內部指針有沒有指向結尾,才知道什么時間結束,所以使用內置函數feof()//函數返回值如果返回0表示現在的位置不是文件尾部,返回非0說明是文件的結尾了。while(!feof(f_pic)){ch=fgetc(f_pic);//上邊定義的ch是用來暫時存放讀取的那個數據//fgetc()這個函數就會讀取f_pic這個文件里面的一個字節,然后把他當作返回值賦值給ch.fputc(ch,f_finish); //然后將ch給了finish_name這個文件.(參數1:需要寫入的字符;參數2:需要寫入的文件的指針)}//進行到文件尾部就會退出while,所以我們要關掉這個文件指針fclose(f_pic);//現在把壓縮文件接到后邊去(當要接一個文件后邊繼續添加內容時:(就比如上邊已經拷貝進去一個了要接著在文件中在后邊再添加一個)這時這里的文件內部指針不用去管它,當他拷貝到文件后面呢最后一個位置時他的指針現在是指向文件最后一個格的(也就是最后一個字節的))while(!feof(f_file)){ch=fgetc(f_file);//上邊定義的ch是用來暫時存放讀取的那個數據//fgetc()這個函數就會讀取f_pic這個文件里面的一個字節,然后把他當作返回值賦值給ch.fputc(ch,f_finish); //然后將ch給了finish_name這個文件.(參數1:需要寫入的字符;參數2:需要寫入的文件的指針)}//進行到文件尾部就會退出while,所以我們要關掉這個文件指針fclose(f_file);fclose(f_finish);//都關掉system("pause");}
-----上邊是一個個字節讀取現在字符串的讀寫函數:fgets和fputs
字符串的輸入輸出函數fputs()和fgets()。
//fgets()函數
//函數調用形式如:fgets(str,n,fp);//有三個參數
//函數作用:從fp所指的文件中讀出n-1個字符送入字符數組str中,因為在最后加一個'\0'(字符串的標志結尾0,C語言規定字符串的結尾是以\0來標志的,其他語言有所不同).
//函數返回值:返回str的首地址。
讀出示例:
//有一個1.txt文件,我想把它讀出來,然后打印到屏幕上
#include<stdio.h>
#include<stdlib.h>
#define LEN 11//用宏定義方便后期改字節,不用一個個去改
void main()
{FILE *fp;char buffer[LEN];//定義一個字符緩沖區,該字符緩沖區有LEN這么長,也就是下邊可以讀取LEN-1個字節,因為最后一個字節他會自動加上‘\0’,表示字符串結束。if(!fp=fopen("1.txt","rt"))//fp指向的是1.txt這個文件 {printf("\nCannot open file strike any key exit!");exit(1);}fgets(buffer,LEN,fp);//從fp拿到LEN-1這么長的東西,給了buffer這個緩沖區printf("%s\n",buffer);//把buffer緩沖區的內容以字符串的形式打印出來 fclose(fp);//關閉}
fputs()字符串的寫入一個文件:
//fputs函數
//函數調用方式:fputs("FISHC",fp);//將FISHC輸入到我們fp所指向的這個文件中
//函數作用:把字符串"FISHC"寫入fp所指的文件之中。
//函數返回值:輸入成功的話,返回值為0;輸入失敗的話,返回值時EOF。
寫入函數示例:
//從屏幕上輸入一個字符串,然后程序截取這個字符串,把他給放到這個文件的結尾處
#include<stdio.h>
#include<stdlib.h>
#define LEN 20
void main()
{FILE *fp;char ch,buffer[LEN];//建立20個長度的緩沖區用來放入從屏幕上輸入的字符串if(!fp=fopen("1.txt","at+"))//這里以“at+”的形式寫入,粘貼在后面(意思就是將1.txt這個文件打開,將內部的文件指針指向了結尾處,然后我們從這里寫入的話是從文件的結尾開始寫){printf("\nCannot open file strike any key exit!");exit(1);}printf("Please input a string:\n",buffer);//正常做法輸入字符串用scanf()//scanf("%s",buffer);//接收一個字符串,然后把他存在buffer這個緩沖區里面//因為scanf這個函數使用%s接收字符串的話,當他遇到空格和回車的時候,他都是自動聲明這個接收已經結束了,后邊的就不再接收了。//前邊講過fgets()是從文件中獲取字符串,那為什么這里可以從我們的鍵盤獲取?(因為我們的鍵盤實際上也是夜歌特殊的文件,叫做stdin文件,標準輸入文件,我們從鍵盤上輸入的東西會放入stdin這個文件,作為一個緩沖區存放到里面去,那么我們就從stdin這里面讀就可以了)fgets(buffer,LEN,stdin);//寫入的話用fgets()來寫,而不用scanf().//為什么不用scanf()?stdin又是啥?fputs(buffer,fp);//把buffer寫入到fp這個文件里面去(fputc如果是c的話參數Buffer就得表示一個字節,fputs如果是s的話參數buffer就得是一個字符串,但是fp都是一個指向的文件。)rewind(fp);//(寫完之后)重新定義文件內部指針去指向到開頭處(這樣是比較優良的做法,不這樣做也沒問題)(這里之所以這么做,因為我還想把他再打印出來,這樣可以讓我們看到整個文件寫進去之后有所改變)ch=fgetc(fp);while(ch!=EOF)//這里使用一個循環,只要他不是文件結尾他就會把它輸出到屏幕上{putchar(ch);ch=fgetc(fp);}printf("\n");fclose(fp);//關閉}
數據塊讀寫函數fread()和fwrite()。//可以使用fread和fwrite來進行數據的操作。
什么是數據塊呢?剛才是一串一串的讀,我們現在是一塊一塊的讀。
//函數調用:
//fread(buffer,size,count,fp);
//fwrite(buffer,size,coubt,fp);
//參數說明:
//buffer:是一個指針。(對fread來說,他是一個讀入數據的存放地址;對fwrite來說,是要輸出數據的地址(均指起始地址))(是一個緩沖區)
//size要讀寫的字節數。(這個塊非常靈活,你可以當他是一個字節一個字節或者10個字節一個塊也行)
//count:要進行讀寫多少個size字節的數據項。(次數/個數。比如我的size是10個字節,count是2,那就是你讀取了20個字節。(就是以10個字節分為1塊,讀取count2個塊))
//fp:是一個文件的指針。
示例:如下結構:
struct student_type
{ char name[20]; int num;int age;char addr[30];
}stud[40];//定義了40個學生,每個學生都是一個這樣的結構//讀取方式
for(I=0;i<40;i++)
{fread(&stud[i],sizeof(struct student_type),1,fp);//聲明要讀取到std這個變量里邊去,每次讀取的大小是sizeof,每次讀一次就是一個學生,從fp這個文件
}
//寫入也一樣每次寫入一個學生的內容(你如果按照原來一個字節一個字節的來寫,那么各個學生就會打亂了)
for(I=0;i<40,i++)
{fwrite(&stud[i],sizeof(struct student-type),1,fp);
}
要求:從鍵盤輸入4個學生的有關數據,然后以二進制的格式存儲到磁盤文件。
#include<stdio.h>
#include<stdlib.h>
define SIZE 4;
struct student
{char name[10]; int num;int age;char addr[15];
}stu[SIZE];
void save()
{FILE *fp;int i;if(!(fp=fopen("student-list","wb")))//student-list是一個二進制文件{printf("Cannot open the file!\n"); return; }for(i=0;i<size;i++){if(fwrite(&stu[i],sizeof(struct studet),1,fp)!=1){printf("File write error!\n");fclose(fp);}}
}
//寫一個load()函數將該文件讀取并顯示
void load()
{FILE *fp;int i;if(!(fp=fopen("student-list","r")))//student-list是一個二進制文件{printf("Cannot open the file!\n"); return; }//讀取方式for(i=0;i<40;i++){fread(&stud[i],sizeof(struct student),1,fp);//printf("%s,%d,%d,%s",&stud[i].name,&stud[i].num,&stud[i].age,&stud[i].address);//不需要這一行(因為fread帶顯示)fclose(fp);}
void main()
{ int i;printf("Please input student's name,num,age,address:\n");for(i=0;i<40,i++){scanf("%s %d %d %s",stud[i].name,&stud[i].num,&stud[i].age,&stud[i].address); }//此時輸入的都是輸入到緩沖區文件里邊去save();load();
}
-----格式化讀寫函數(fprintf()和fscanf())//(跟平時使用的printf和scanf是一樣的,前邊多了一個f表示是對文件的讀寫)(如果沒有f的話它是對我們的鍵盤還有顯示器,寫入/寫進到顯示器就是輸出數來,從鍵盤上讀取字符。)
//函數調用:
//fprintf(文件指針,格式字符串,輸出表列);
//fscanf(文件指針,格式字符串,輸出表列);
//函數功能:從磁盤文件中按照格式讀入或輸出字符。
//例如:
//fprintf(fp,"%d,%6.2f",i,t);// “%6.2f”表示6位的浮點數,兩位的小數點,然后存放在這個t這個浮點型的變量里面。
//fscanf(fp,"%d,%f",&i,&t);
-----順序讀寫和隨機讀寫
順序讀寫:以上將的都是順序讀寫(就是從文件打開,從頭開始往后這么寫進去/或者讀出來 )
位置指針按字節位置順序移動。
隨機讀寫:讀寫完一個字符(字節)后,并不一定要讀寫其后續的字符(字節),而可以讀寫文件中任意位置上所需要的字符(字節)(這個位置我們是可以控制它的,那么我們就必須要學一個fseek函數)
fseek函數(一般用于二進制的文件比較多)(作用是改變文件的位置指針)
//函數功能:
//改變文件的位置指針(這個函數主要是改變文件內部的指針,改變它我們就可以跳躍性的讀寫,比如說讀了第一個字符之后我就用fseek把他跳躍到第以00個字符,之后我就從第100個字符開始讀了)
//函數調用格式:
//fseek(文件類型指針,位移量,起始點);
//第三個參數:起始點:
//文件開頭 SEEK_SET 0//如果起始點設置的是0的話,他的宏定義是SEEK_SET,他是從文件的開頭位置開始讀的
//文件當前位置 SEEK_CUR 1//如果起始位置設為1的話他是從文件的當前的文件指針的位置,因為我們每讀過一次,他的文件指針都會向后移一格
//文件末尾 SEEK_END 2//如果是2的話,宏定義是SEEK_END的話,他是標志著從文件的末尾開始讀取
//第二個參數:位移量
//位移量:以起始點為基點,向前移動的字節數(以這個起始點標志的位置以后的偏移量等于多少,就是這個位移量一般都是以long型的形式存在的)
//例如:fseek(fp,100L,0);//將位置指針移到離文件頭100格字節處//L表示long型
//fseek(fp,50L,1);//將位置指針移到離當前位置50個字節處(這個當前位置就不一定是文件頭了,說不定在之前已經read過多少次了,讀過多少個字節了,那就從你現在接著的地方開始,50個字節處)
//fseek(fp,50L,2);//將文件指針從文件末尾處向后退50個字節(因為已經是最末尾了,不能再前進了,所以表示向后退)
//fseek(fp,i*sizeof(struct stu),0)//這樣的話我們就要通過表達式計算了,i是個變量
例子:在學生文件stu_list中讀出第二個學生的數據
struct student
{char name[10];int num;int age;char addr[15];
}boy;//student結構中的Boy變量
void main()
{FILE *fp;int i;//用于定位i個結構if(!(fp=fopen(student_list,"r"))){printf("Cannot open the file!\n");return;}rewind(fp);//設置內部文件指針指向頭(也就是重置了文件指針)fseek(fp,i*sizeof(struct student),0);//這個時候文件內部指針已經指向了第二個學生的開頭位置fread(&boy,sizeof(struct student),1,fp);//&boy第一個傳給他緩沖區就是存放的一個地址。然后sizeof(struct student)存放多少(一塊讀取多少),1讀取一塊就行了,fp指向文件printf("name\tnumber age addr\n");//打印出來printf("%s\t%5d %7d %s\n",boy.name,boy.num,boy.age,boy.addr);fclose(fp);system("pause");
}
ftell函數
//函數作用:得到流式文件(就是我們的文件流)中當前位置,用相對于文件開頭的位移量來表示。
//返回值:返回當前位置(就是當前位置離文件開頭的偏移量),出錯時返回-1L,在文件頭就是返回0,在文件頭一個字節的地方他就是返回1。
//應用舉例;
i=ftell(fp);
if(i==-1L)
{printf("erroe\n");
}
---出錯的檢測ferror函數(對于檢測輸入輸出會不會出現錯誤)
//ferror函數
//調用形式:
ferror(fp);
//返回值:返回0,表示未出錯;返回非0,表示出錯。
//注意:在調用一個輸入輸出函數后立即檢查ferror函數的值,否則信息會丟失(就是會被下一個覆蓋掉)。再指向fopen函數時,ferror函數的初始值自動置為0(因為剛剛打開,打開成功的話初始值是設為0的)。
?----clearerr函數
//調用形式:
clearer(fp);
//函數作用:使文件錯誤標志和文件結束標志置為0.
//注意:只要出現錯誤標志,就一直保留,直到對同一文件調用clearerr函數或rewind函數,或任何其他一個輸入輸出函數。
總結:
? ?
?
?
總結
以上是生活随笔為你收集整理的C语言:随笔11--文件操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言:随笔10--共用体
- 下一篇: ladar:16线激光雷达(雷神)