打開文件數組
#include <stdlib.h> exit(0);//頭文件:#include <stdlib.h> // exit 結束程序,通常0爲正常退出,其餘數字爲異常,其對應的錯誤能夠本身指定 FILE *fopen(const *char,const *mode); /** *path:指定打開文件路徑和文件名 *mode:打開模式; * r:只讀,從文件頭開始讀取;文件必須存在 * w:只寫(重寫),從文件頭開始重寫【寫入內容覆蓋整個文件】;若文件不存在,則建立一個新的文件 * a:追加,在文件尾部追加內容;若文件不存在,則建立一個新的文件 * r+:讀寫,從文件頭開始讀取和覆蓋【只覆蓋從頭開始的相應字節內容,其他字節會保留】;文件必須存在 * w+:讀和從寫,從文件頭開始讀和重寫;若文件不存在,則建立一個新的文件 * a+:讀和追加,讀取位置是從文件頭開始,寫入在文件尾部追加;若文件不存在,則建立一個新的文件 * b:與以上6種模式結合用於操做二進制文件;("rb","wb","ab","r+b","w+b","a+b")*/
以字符形式讀寫緩存
FILE *fp=fopen("hello.txt",""a+"); //打開文件 char ch=getc(fp);
(ch)!=EOF /** *每次讀取一個字符,讀取到( EOF:宏定義爲-1 )結束 *fgetc()和getc的區別:fgetc()爲函數實現;爲getc()則爲宏的實現 *宏避免了方法調用堆棧的操做,但不能傳入內聯函數(如 i++操做,可能使用以後得出錯誤結果) */ putc( ch,fp ); //寫入文件一個字符 ( fputc()/putc()的關係與fgetc()/getc()同樣 ) fclose( fp );//關閉文件
以字符串形式讀寫函數
char *fgets(char *s,int size,FILE *stream ); /** *讀取一個字符串最大長度爲 [size-1] ;遇到換行符和文件結束時會結束本次讀取,且 '\n' 會被認爲合法字符串讀取; *讀取到文件結束時,將會設置末尾指示器【 feof( FILE *stream ); 沒設置時返回非0,設置後返回0】 *s:字符型指針,指向用於存放讀取字符串的位置;讀取失敗時 s 指向的數據不變 *size:指定讀取的字符數(包括最後的 '\0' ) *stream :爲讀取的文件指針; *返回值:返回s參數指向的地址,即爲保存字符串的地址 */ int fputs( const char *s,FILE *stream ); /** *向 stream 指向的文件寫入一個字符串 *s:指向待寫入字符串的位置(字符串結束位置的 '\0' 不會寫入到文件); *stream :爲讀取的文件指針; *寫入成功返回一個得0值,不然返回EOF(-1); */
格式化讀寫spa
int fprintf( FILE *stream,const char *format,... ); //優點:能夠格式化寫入,能夠帶一些變量 //如:fprintf( fp,"%d-%d-%d",year,mon,day ); int fscanf( FILE *stream,const char *format,... ); //優點:能夠格式化讀取,把讀取到的部份內容賦值給一些變量 //如:fscanf( fp,"%d-%d-%d",&year,&mon,&day );
以二進制讀寫指針
一、 打開模式字符串加了 'b',用以上方法是能夠以二進制形式讀寫;
二、用專門的二進制讀寫方法:(這樣就直接能夠寫入結構體了)code
size_t fwrite( void *ptr,size_t size,size_t nmemb,FILE *stream ); size_t fread( void *ptr,size_t size,size_t nmemb,FILE *stream ); /** *ptr:指向存放數據的指針,該內存的尺寸是 [size*nmenb] 個字節 *size:指定要讀取的每一個元素的尺寸,最終尺寸爲 [size*nmenb] *nmemb:指定讀取的元素個數 *stream:指定帶讀取的文件流 *返回值:實際上讀到的元素個數;若是該值小於 nmemb,就說明讀取到文件末尾或有錯誤(能夠用feof()或ferror()標誌判斷) */
隨機讀寫orm
經過修改打開文件的位置指示器來達到直接讀取目標位置的方法blog
long int ftell( FILE *stream ); /** *獲得位置指示器的值;編譯器認爲文件的內容是一個字符數組 *返回值:long 類型的值,返回值即爲當前位置字符的下標 */ rewint( FILE *stream ); /** *將位置指示器初始化到文件頭位置 *寫入一些數據後,用該方法回到文件頭位置繼續寫入會覆蓋原有內容相應字節的內容 */ int fseek( FILE *stream,long int offsef,int whence ); /** *用於設置文件流的位置指示器的位置 *stream:指定代操做的文件流 *offsef:指定從 whence 參數的位置器移動多少個字節 *whence:指定開始移動位置;能夠用: * SEEK_SET【文件頭】 * SEEK_CUR【 當前的讀寫位置 】 * SEEK_END【 文件末尾 】 *返回值:成功返回0;失敗返回非0值;如:fseek( fp,sizeof(student Stu)*1,SEEK_SET ); */
文件中的指示器內存
int feof( FILE *stream );
//位置指示器,讀到文件末尾時返回非0值 int ferror( FILE *stream );
//錯誤指示器,文件讀寫發生錯誤時返回非0值(判斷是否進行錯誤處理) clearerr( FILE *stream );
//同時清除位置指示器和錯誤指示器的狀態
程序執行時會打開3個面向終端的標準流字符串
stdin; //標準輸入(scanf函數接收數據) stdout; //標準輸出(printf函數打印字符串) sederr; //標準錯誤輸出(自動打印報錯信息) //重定向:因爲標準輸出流和標準錯誤輸出流都是直接將信息打印在終端;因此 Linux 能夠經過重定向的方法將3個流的信息重定向到一個文件中 //從定向標準輸入:< 從定向標準輸出:> 從定向標準錯誤輸出:2>例如: gcc test1.c && ./a.out //(編譯text1.c文件) ./a.out 2> error.txt //(執行a.out,並將錯誤輸出流重定向到 error.txt 中) ./a.out > output.txt //(執行a.out,並將輸出流重定向到 output.txt 中) ./a.out > 1.txt 2> 2.tet
IO緩衝區:(刷新緩衝區)
一、fflush( FILE *stream );函數主動刷新
二、緩衝區自動刷新
按塊緩存:填滿緩衝區後才進行實際的設備讀寫操做
按行緩存:接收到換行符以前,數據都是先緩存在緩衝區中的
不緩存:直接讀寫設備上的數據
int setvbuf( FILE *stream,char *buf,int mode,size_t size ); /** *設置緩存模式 *stream:指定打開的數據流; *buf:傳入字符數組,指定分配的緩衝區(爲NULL時,函數會自動分配一個指定尺寸的緩衝區) *size:指定緩衝區的尺寸( 字節 ); *mode:緩衝區模式 * _IOFBF(按塊緩存) * _IOLBF(按行緩存) * _IONBF(不緩存) *返回值:調用成功返回0;調用失敗返回非0值 */