高階檔案程式設計 標準檔案操作的函式

2021-05-21 23:18:15 字數 4528 閱讀 7262

高階檔案程式設計——標準檔案操作的函式 

本節所講的檔案讀寫函式均是指順序讀寫, 即讀寫了一條資訊後, 指標自動 

加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 從原始檔中逐...