高階檔案程式設計——標準檔案操作的函式
本節所講的檔案讀寫函式均是指順序讀寫, 即讀寫了一條資訊後, 指標自動
加1。下面分別介紹寫操作函式和讀操作函式。
1. 檔案的順序寫函式
fprintf()、fputs()和fputc()函式
函式fprintf()、fputs()和fputc()均為檔案的順序寫操作函式, 其呼叫格
式如下:
int fprintf(file *stream, char *format, );
int fputs(char *string, file *steam);
int fputc(int ch, file *steam);
上述三個函式的返回值均為整型量。fprintf() 函式的返回值為實際寫入文
件中的字罕個數(位元組數)。如果寫錯誤, 則返回乙個負數, fputs()函式返回0時
表明將string指標所指的字串寫入檔案中的操作成功, 返回非0時, 表明寫操
作失敗。fputc()函式返回乙個向檔案所寫字元的值, 此時寫操作成功, 否則返
回eof(檔案結束結束其值為-1, 在stdio.h中定義)表示寫操作錯誤。
fprintf( ) 函式中格式化的規定與printf( ) 函式相同, 所不同的只是
fprintf()函式是向檔案中寫入。而printf()是向螢幕輸出。
下面介紹乙個例子, 執行後產後乙個test.dat的檔案。
例11:
#include
main()
用dos的type命令顯示test.dat的內容如下所示:
螢幕顯示
your score of toefl is: 617
that's good news
2. 檔案的順序讀操作函式
fscanf()、fgets()和fgetc()函式
函式fscanf()、fgets()和fgetc()均為檔案的順序讀操作函式, 其呼叫格式
如下:
int fscanf(file *stream, char *format, );
char fgets(char *string, int n, file *steam);
int fgetc(file *steam);
fscanf()函式的用法與scanf()函式相似, 只是它是從檔案中讀到資訊。
fscanf()函式的返回值為eof(即-1), 表明讀錯誤, 否則讀資料成功。fgets()函
數從檔案中讀取至多n-1個字元(n用來指定字元數), 並把它們放入string指向的
字串中, 在讀入之後自動向字串未尾加乙個空字元, 讀成功返回string指標,
失敗返回乙個空指標。fgetc()函式返回檔案當前位置的乙個字元, 讀錯誤時返
回eof。
下面程式讀取例11產生的test.dat檔案, 並將讀出的結果顯示在螢幕上。
例12
#include
main()
執行後螢幕顯示:
your score of toefl is: 617
that's good news
如果將上例中fscanf(fp, "%d", &i)改為fscanf(fp, "%s", m), 再將其後
的輸出語句改為printf("%s", m), 則可得出同樣的結果。由此可見turbo c2. 0
中只要是讀文字檔案, 則不論是字元還是數字都將按其ascii值處理。 另外還要
說明的一點就是fscanf()函式讀到空白符時, 便自動結束, 在使用時要特別注意。
3. 檔案的隨機讀寫
有時使用者想直接讀取檔案中間某處的資訊, 若用檔案的順序讀寫必須從檔案
頭開始直到要求的檔案位置再讀, 這顯然不方便。標準io庫提供了一組檔案的
隨機讀寫函式, 即可以將檔案位置指標定位在所要求讀寫的地方直接讀寫。
檔案的隨機讀寫函式如下:
int fseek (file *stream, long offset, int fromwhere);
int fread(void *buf, int size, int count, file *stream);
int fwrite(void *buf, int size, int count, file *stream);
long ftell(file *stream);
fseek()函式的作用是將檔案的位置指標設定到從fromwhere開始的第offset
位元組的位置上, 其中fromwhere是下列幾個巨集定義之一:
檔案位置指標起始計算位置fromwhere
━━━━━━━━━━━━━━━━━━━━━━━━━━━
符號常數 數值 含義
───────────────────────────
seek_set 0 從檔案開頭
seek_cur 1 從檔案指標的現行位置
seek_end 2 從檔案末尾
━━━━━━━━━━━━━━━━━━━━━━━━━━━
offset是指檔案位置指標從指定開始位置(fromwhere指出的位置)跳過的字
節數。它是乙個長整型量, 以支援大於64k位元組的檔案。fseek()函式一般用於對
二進位制檔案進行操作。
當fseek()函式返回0時表明操作成功, 返回非0表示失敗。
下面程式從二進位制檔案test_b.dat中讀取第8個位元組。
例13:
#include
main()
fseek(fp, 8. 1, seek_set);
fgetc(fp);
fclose(fp);
} fread()函式是從檔案中讀count個字段, 每個字段長度為size個位元組, 並把
它們存放到buf指標所指的緩衝器中。
fwrite()函式是把buf指標所指的緩衝器中, 長度為size個位元組的count個字
段寫到stream指向的檔案中去。
隨著讀和寫位元組數的增大, 檔案位置指示器也增大, 讀多少個位元組, 檔案位
置指示器相應也跳過多少個位元組。讀寫完畢函式返回所讀和所寫的字段個數。
ftell()函式返回檔案位置指示器的當前值, 這個值是指示器從檔案頭開始
算起的位元組數, 返回的數為長整型數, 當返回-1時, 表明出現錯誤。
下面程式把乙個浮點陣列以二進位制方式寫入檔案test_b.dat中。
例14:
#include
main()
; /*定義浮點陣列並初始化*/
int i;
file *fp;
fp=fopen("test_b.dat", "wb"); /*建立乙個二進位制檔案只寫*/
fwrite(f, sizeof(float), 6, fp);/*將6個浮點數寫入檔案中*/
fclose(fp); /*關閉檔案*/
} 下面例子從test_b.dat檔案中讀100個整型數, 並把它們放到dat陣列中。
例15:
#include
main()
注意:
當用標準檔案函式對檔案進行讀寫操作時, 首先將所讀寫的內容放進緩衝區,
即寫函式只對輸出緩衝區進行操作, 讀函式只對輸入緩衝區進行操作。例如向一
個檔案寫入內容, 所寫的內容將首先放在輸出緩衝區中, 直到輸出緩衝區存滿或
使用fclose()函式關閉檔案時, 緩衝區的內容才會寫入檔案中。若無fclose()
函式, 則不會向檔案中存入所寫的內容或寫入的檔案內容不全。有乙個對緩衝區
進行重新整理的函式, 即fflush(), 其呼叫格式為:
int fflush(file *stream);
該函式將輸出緩衝區的內容實際寫入檔案中, 而將輸入緩衝區的內容清除掉。
4. feof()和rewind()函式
這兩個函式的呼叫格式為:
int feof(file *stream);
int rewind(file *stream);
feof()函式檢測檔案位置指示器是否到達了檔案結尾, 若是則返回乙個非0
值, 否則返回0。這個函式對二進位制檔案操作特別有用, 因為二進位制檔案中, 文
件結尾標誌eof也是乙個合法的二進位制數, 只簡單的檢查讀入字元的值來判斷文
件是否結束是不行的。如果那樣的話, 可能會造成檔案未結尾而被認為結尾, 所
以就必須有feof()函式。
下面的這條語句是常用的判斷檔案是否結束的方法。
while(!feof(fp))
fgetc(fp);
while為迴圈語句, 將在下面介紹。
rewind()函式用於把檔案位置指示器移到檔案的起點處, 成功時返回0, 否
則, 返回非0值
幾個標準檔案
與其有關的 stdin stdout unix 標準輸出 裝置 檔案,對應終端的螢幕。程序將從標準輸入檔案中得到輸入資料,將正常輸出資料輸出到標準輸出檔案,而將錯誤資訊送到標準錯誤檔案中。在c中,程式執行時,一直處於開啟狀態。可能的使用方法有 fprintf stderr,error message...
include 標準檔案
在標準要求裡有多個訊號巨集 sighup 1 a 終端掛起或者控制程序終止 sigint 2 a 鍵盤中斷 如break鍵被按下 sigqu99v 3 c 鍵盤的退出鍵被按下 sigill 4 c 非法指令 sigabrt 6 c 由abort 3 發出的退出指令 sigfpe 8 c 浮點異常 s...
C語言及程式設計高階例程 35 標準檔案讀寫方法
賀老師教學鏈結 c語言及程式設計高階 本課講解 示例 以字元為單位複製檔案 複製檔案a.txt,儲存到b.txt中 include include int main if fp2 fopen b.txt w null 開啟用於寫入的目標檔案 while ch fgetc fp1 eof 從原始檔中逐...