1.putw和getw函數
【例22.19】下面程序給出一個奇怪的輸出,找出並改正錯誤。
#include <stdio.h> int main (void ) { int i=0 ,j ; FILE *fp ; fp=fopen (\"t.txt\" ,\"w\" ); for (i=90 ;i<100 ;i++ ) putw (i , fp ); for (i=0 ;i<10 ;i++ ) { j=getw (fp ); printf (\"%d \" , j ); // 輸出80 81 ……88 89 } printf (\"n\" ); fclose (fp ); return 0 ; }
【解答】如果以這種方式寫/讀文件,必須在寫入後關閉文件,再以讀方式打開文件,才能正確讀入數據。也可以將文件以「w+」方式打開,但完成文件之後,要將文件指針恢復到文件起始點,才能保證正確地讀取文件內容。下面給出這種方式的實現程序,程序中將讀取內容直接作為printf函數的參數。
#include <stdio.h> int main (void ) { int i=0 ,j ; FILE *fp ; fp=fopen (\"t.txt\" ,\"w+\" ); for (i=90 ;i<100 ;i++ ) putw (i , fp ); rewind (fp ); // 將文件指針恢復到起點 for (i=0 ;i<10 ;i++ ) printf (\"%d \" , getw (fp )); printf (\"n\" ); fclose (fp ); return 0 ; }
大多數C編譯系統都提供了這兩個函數:putw和getw。Putw函數用來對磁盤文件讀寫一個字(整數),getw函數從磁盤文件讀一個整數賦給內存變量。如果所用的C編譯的庫函數中不包括putw和getw函數,可以自己定義這兩個函數。同樣,也可以編寫出讀寫任何類型數據的函數。
【例22.20】下面程序讀出文件的內容有誤,找出並改正錯誤。
#include <stdio.h> int main () { int i=0 ; FILE *fp ; fp=fopen (\"t.txt\" ,\"w+\" ); putw (230026 , fp ); putw (230039 , fp ); putw (024 , fp ); rewind (fp ); for (i=0 ;i<3 ;i++ ) printf (\"%d \" , getw (fp )); printf (\"n\" ); fclose (fp ); return 0 ; }
【解答】輸出為「230026 230039 20」,024是8進制,程序用10進制數出,所以變成了20。為了區分,打印時也用8進制符號輸出。將循環改為只輸出2個10進制整數,另外使用8進制輸出024。即改為如下形式:
for (i=0 ;i<2 ;i++ ) printf (\"%d \" , getw (fp )); printf (\"%#on\" , getw (fp ));
程序輸出「230026 230039 024」,滿足要求。
2.fgets函數和fputs函數
【例22.21】下面程序的每個輸出均少了一個字符,請說明原因並改正錯誤。
#include <stdio.h> #include <string.h> int main (void ) { char str[128] ,st=\"How are you ?\" ; FILE *fp ; fp=fopen (\"t.txt\" ,\"w+\" ); fputs (st , fp ); rewind (fp ); fgets (str ,strlen (st ),fp ); printf (\"%s \" , str ); printf (\"n\" ); rewind (fp ); fgets (str ,3 ,fp ); printf (\"%s \" , str ); printf (\"n\" ); fclose (fp ); return 0 ; }
【解答】程序的輸出結果為:
How are you Ho w are you ?
fgets的作用是從指定文件讀入一個字符串。字符串必須有結束標誌,所以語句
fgets ( str ,n ,fp );
只能從fp指向的文件讀入n-1個字符,把它們放到字符數組str中,存入一個結束標誌並返回str的地址。strlen(st)計算出的是字符串的實際數目,因此少了一個字符「?」。改為語句
fgets (str ,strlen (st )+1 ,fp );
即可輸出「How are you?」。
此時fp的指針將停留在最後的n-1的位置,所以要將文件指針恢復到起始狀態,才能從文件起始處再次讀入字符串。理由同前,語句
fgets (str ,3 ,fp );
只能去讀2個字符,所以輸出「Ho」。下一次讀入則從w處開始讀取,因此輸出又多了一個w,將上一句改為
fgets (str ,4 ,fp );
既可以保證輸出「How」,又可以使後一句的輸出為「are you?」。注意a前面有一個空格,所以結果成為如下的形式:
How are you Ho are you ?
fputs函數的作用是向指定的文件輸出一個字符串,例如:
fputs ( \"China \" ,fp );
是把字符串\"China\"輸出到fp指向的文件。fputs函數中第一個參數可以是字符串常量、字符數組名或字符型指針。如果輸出成功,函數返回值為0;輸出失敗時,返回非零值。
這兩個函數與gets和puts函數類似,只是它們是以指定的文件作為讀寫對象的。