)
第十二章 文件第二節(jié) 文件的開,關(guān),讀,寫實戰(zhàn)操練1. 文件的打開文件在讀或?qū)懼氨仨氁蜷_在讀或?qū)懼蟊仨氁P(guān)閉fopen文件打開函數(shù)fopen函數(shù)的調(diào)用方式FILE *fp; // FILE是個結(jié)構(gòu)fp是指向結(jié)構(gòu)FILE的指針變量 fp fopen(文件名 使用的文件的方式) //文件名和使用文件的方式都是字符串“” fp fopen(a.txt, r); //打開a.txt文件, 使用的打開方式為只讀 // fp現(xiàn)在就指向了打開的a.txt文件 // sizeof(FILE) if(fp NULL){ 文件打開失敗 }通過fopen語句告訴系統(tǒng)三個信息需要打開的文件名使用文件的方式讓哪個指針變量指向被打開的文件,這里是fp這個指針變量文件有個位置指針fgetc2. 文件的關(guān)閉只有fopen成功的文件才需要關(guān)閉關(guān)閉文件的原因釋放該文件占用的內(nèi)存單元, 要養(yǎng)成資源用完要及時釋放的好習(xí)慣防止往文件中寫內(nèi)容時,文件內(nèi)容寫入不全(如果緩沖區(qū)沒滿,沒有寫入到磁盤,如果程序關(guān)閉,會導(dǎo)致文件內(nèi)容寫入不全),關(guān)閉文件的動作會觸發(fā)系統(tǒng)把緩沖區(qū)的數(shù)據(jù)立即寫入到磁盤上fclose文件關(guān)閉函數(shù)fclose函數(shù)的調(diào)用方式:// fclose(文件指針)if(fp!NULL){fclose(fp);// fp就是fopen()的返回值}3. 文件的讀寫簡單講fputc和fgetc函數(shù)fputc():該函數(shù)把一個字符寫到磁盤文件上去,一般形式為fputc(ch,fp);//ch就是這個字符,如果fputc失敗,會返回EOF,如果成功,返回值就是寫入文件的那個字符的ascii碼值EOF (End of file) // #define EOF (-1)#includeiostream#includecstringintmain(intargc,char*argv[]){FILE*fp;fpfopen(test.txt,w);//打開只寫文件,如果文件存在,文件內(nèi)容清空,如果文件不存在,則創(chuàng)建文件if(fpNULL){printf(文件打開失敗!\n);}else{// 文件打開成功charrecofputc(a,fp);if(recoEOF){//寫入失敗}else{charrecofputc(b,fp);}}if(fp!NULL){fclose(fp);// fp就是fopen()的返回值}return0;}fgetc: 從指定文件讀入一個字符調(diào)用形式: char reco fgetc(fp)如果執(zhí)行成功,返回讀入的字符,如果讀入失敗,或者整個文件讀到末尾,返回EOF#includeiostream#includecstringintmain(intargc,char*argv[]){FILE*fp;// 文件剛打開,文件位置位于當前文件的頭部// 以文本方式打開數(shù)據(jù)fpfopen(test.txt,r);if(fpNULL){printf(文件打開失敗!\n);}else{// 文件打開成功// 讀出一個字符,每讀出一個字符,指針向下移一個字符charrecofgetc(fp);// 判斷文件是否讀入結(jié)束while(reco!EOF){putchar(reco);recofgetc(fp);}}if(fp!NULL){fclose(fp);// fp就是fopen()的返回值}return0;}feof(fp); //文件是否結(jié)束,如果文件結(jié)束,feof(fp)返回真(1), 如果文件沒有結(jié)束,feof(fp)返回假(0)4. 文件讀寫實戰(zhàn)操練商業(yè)代碼,需要非常嚴謹#includeiostream#includecstringintmain(intargc,char*argv[]){FILE*fpfopen(test.txt,r);// if(fp NULL)if(!fp){printf(文件打開失敗!\n);}else{// 文件打開成功charLineBuff[1024];//足以容納一行的內(nèi)容while(!feof(fp)){LineBuff[0]0;// \0// 每次讀取一行if(fgets(LineBuff,sizeof(LineBuff)-1,fp)NULL){continue;}if(LineBuff[0]\0){continue;}lblprocstring:// 讀到了實際內(nèi)容if(strlen(LineBuff)0){// 如果末尾是換行符或者回車符if(LineBuff[strlen(LineBuff)-1]10||LineBuff[strlen(LineBuff)-1]13){LineBuff[strlen(LineBuff)-1]\0;gotolblprocstring;}}if(strlen(LineBuff)0){continue;}printf(%s\n,LineBuff);}}if(fp!NULL){fclose(fp);// fp就是fopen()的返回值}return0;}