讀古今文學網 > C語言解惑 > 22.3 其他讀寫函數 >

22.3 其他讀寫函數

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函數類似,只是它們是以指定的文件作為讀寫對象的。