發現最近寫的程式總是要用到檔案操作,所以把C語言與檔案輸入輸出有關的函數複習一下。
C語言是通過將一個檔案類型指標與檔案關聯起來來對檔案進行開啟、關閉、輸入、輸出。
檔案類型為FILE(實際上是一個結構體)。定義一個檔案指標為FILE *fp;就可以將fp和某個檔案關聯起來進行操作了。例如要開啟一個檔案:
FILE *fp;
fp=fopen("filename",“開啟檔案”);//fopen的傳回值為NULL或指向檔案的指標
或者直接FILE *fp=("filename","開啟檔案");
如果要重新導向只需將指標fp和另一個檔案關聯。意思是可用一個檔案指標操作多個檔案。
檔案使用完後要及時關閉。這是個好習慣。關閉函數為fclose(fp);這樣fp就不在和之前指向的檔案關聯了。
1.判斷檔案是否開啟成功:
判斷檔案是否開啟成功可用fopen的傳回值if((fp=fopen("filename","r"))==NULL)則開啟失敗。
2.判斷檔案是否結束:
判斷ASCII檔案是否結束fgetc()會返回結束標誌EOF(即-1)由於二進位檔案資料會出現-1所以必須用函數feof(fp)判斷,feof(fp)==1則已結束。所以讀入一個檔案可以while(!feof(fp)){c=fgetc(in); ...}
3.單個字元的輸入輸出:fgetc()和fputc()
ch=fgetc(fp);fp為檔案指標,且fgetc()不會忽略空格和斷行符號符,只能用於讀入字元。
相應的fputc(ch,fp);向檔案輸出字元時也不會忽略空格,斷行符號符
因為fgetc()返回字元所以fgetc()和fputc()通常嵌套使用:fputc(fgetc(in),out)。
fputc()的傳回值為輸入的字元或EOF(-1)(失敗的情況下)
fgetc()的傳回值為讀入的字元(包括檔案結束標誌EOF(-1))
4.資料區塊的輸入輸出:fread(buff,size,count,fp)和發fwrite(buffer,size,count,fp)
buffer是一個指標,對於fread,它是讀入資料的存放地址,對於發fwrite它是要輸出資料的地址,
size是指要讀寫的位元組數,count是要進行讀寫多少個size位元組的資料項目。
如果成功,fread和fwrite都返回成功輸入和讀取的資料區塊個數有可能比count小;不是返回size。
注意:fread參數buffer指向的空間必須大於或等於要讀入的資料區塊大小。
fread和fwrite一般用於二進位檔案的輸入輸出。用於ASCII檔案字元發生轉換的情況下可能出現與原設想的情況不同。
5.putw()和getw()用來對磁碟檔案讀寫一個整數。
例如putw(10,fp);//傳回值為輸出的數字(int)
int i=getw(fp);//失敗則返回-1
但注意putw()和getw()都是按二進位輸入輸出的。
所以如果你用putw()輸入資料到檔案後以文本的方式開啟看到的將都是亂碼。
同樣如果你在文字檔中輸入了數字並儲存,用getw()來讀入的話讀入的結果並不是你想象的那樣。因為它是按二進位讀的。
另外putw()和getw()不是標準庫函數。
6.格式化輸入輸出fscanf()和fprintf();
這兩個函數和標準輸入輸出scanf()和printf()類似,沒啥好說的。
fscanf(檔案指標,格式化字串,輸入序列);
fprintf(檔案指標,格式化字串,輸出序列);
注意:fscanf()和fprintf()只針對ASSCII檔案,如果用他們處理用二進位格式開啟的檔案,它們還是按照ASSCII方式工作。要處理二進位檔案可以用fread()和fwrite().
7.字串輸入輸出fgets()和fputs()
fgets(),fputs()和gets(),puts()類似
不過fgets()有三個參數fgets(str,n,fp)
str為用來儲存讀入內容的字元數組或char*指標。n為要讀入字元的個數。fp為檔案指標。
n:只從檔案讀入n-1個字元,然後在最後加上'\0',因此得到的字串有n個字元。但是如果在讀入n-1個字元前遇到了分行符號或EOF讀入結束,分行符號也讀入。
fgets(str,n,fp)返回str的首地址。
fputs(str,fp)同puts,str為字元數組名或char指標。
fputs()成功後返回0,否則返回EOF。