如何系統學習C 語言(下)之 檔案篇

Charmchin發表於2021-11-13

我們所編寫的程式原始碼以及編譯生成的可執行檔案都屬於檔案。所以檔案的實質就是儲存在外部儲存介質上的一段連續的二進位制資料。

c 語言程式對檔案的處理採用檔案流的形式,程式執行在記憶體中,而檔案是儲存在外部儲存介質上,例如硬碟、U盤等。

一,檔案的開啟與關閉

在程式執行時,就會在指定的檔案之上建立一條管道,當讀取檔案時,資料就會像流水一樣從檔案端流向程式端,而寫入檔案時,資料就會像流水一樣從程式端流向檔案端。從檔案端向程式端的檔案流稱為輸入流,從程式端向檔案端的檔案流稱為輸出流。如下圖:

只要開啟一個檔案就會得到一個檔案流。有了檔案流之後,就可以對檔案進行相應的讀寫操作。

在c語言的標準庫中,有一系列和檔案相關的庫函式,要想使用這些庫函式只需要在程式中包含“stdio.h”這個標頭檔案就可以了。

1,檔案的開啟

開啟檔案使用的函式為 fopen 函式,該函式原型為:

FILE *fopen(const char *fname,const char *mode);

fopen函式的返回值是一個檔案流,其實就是一個FILE結構體型別的指標。這個結構體變數中包含了檔案的名稱、大小、屬性等相關資訊;若執行失敗,則返回空指標。

下面舉一個用fopen函式來開啟檔案的例子:

FILE *pfile=fopen("D:\\test.txt","r");//以“r”只讀模式開啟D盤下的test.txt檔案
if(pfile!=NULL)
	printf("File opened successfully.\n");
else
	printf("Failed to open file.\n");

同時也需注意,“D:\test.txt" 使用的是絕對路徑,由於斜杆

" \ "在c語言中作為轉義字元來使用,因此必須使用" \ \ " ,才能表示一個斜槓字元本身。

2,檔案的關閉

關閉檔案使用"fclose"函式,函式原型如下:

int fclose(FILE *stream);

fclose 函式的功能就是將該函式所指定的檔案流關閉。函式的返回值為int 型別,當函式執行成功,返回整型值1,當函式執行失敗,返回一個EOF(檔案終點),通常定義為-1.

二,檔案的讀寫

開啟檔案、建立檔案流的主要目的是對檔案進行資料的讀取或資料的寫入。下面列舉幾個和檔案讀寫相關的庫函式及其應用例項。

1,以字元的方式讀寫檔案

標準庫提供的fgetc函式和fputc 函式,以字元的方式對檔案進行讀寫操作。

案例:編寫程式,將“I love you” 以字元的方式寫入D盤的test.txt檔案中。程式碼如下:

#include<stdio.h>
int main(){
    char str[]="I love you";
    FILE *pfile=fopen("D:\\test.txt","w");
    if(pfile){
        char *ptmp=str;//臨時指標,指向陣列str的首字元
        while(*ptmp){	//對ptmp解引用,檢查指向的字元是否為空字元
            fputc(*ptmp,pfile);	//將ptmp指向的字元寫入pfile關聯的檔案
            ++ptmp;	//移動指標,指向陣列中下個字元
        }
        fclose(pfile);	//關閉檔案
        puts("Write to complete.");
    }
    else
        puts("File opening failed.");
    return 0;
}

以字元的方式讀取D盤test.txt檔案中的內容,將其儲存到字元陣列中,並列印輸出,程式如下:

#include<stdio.h>
int main(){
    char buf[128];	//字元陣列
    FILE *pfile=fopen("D:\\test.txt","r");	//以只讀模式開啟
    if(pfile){
        char *p=buf;	//指向陣列的首地址的指標p
        while((*p=fgetc(pfile))!=EOF)//從檔案讀取一個字元並儲存到陣列中
            ++p;	//移動指標
        *p='\0';	//將陣列中的EOF字元修改為空字元
        fclose(pfile);
        printf("The read content is:%s\n",buf);
    }
    else
        puts("File opening failed.");
    return 0;
}

2,依行的方式讀寫檔案

fgets函式和fputs函式,可以非常方便的對文字檔案進行一行字元的讀取或寫入。

案例:編寫程式,將“I love you” 以行的方式寫入D盤的test.txt檔案中。程式碼如下:

#include<stdio.h>
int main(){
    FILE *pfile=fopen("D:\\test.txt","w");
    if(pfile){
        if(fputs("I love you",pfile)!=EOF)
            printf("File writen successful.\n");
        else
            printf("Failed to write file.\n");
        fclose(pfile);
    }
    else
        printf("File opening failed.\n");
    return 0;
}

若將“I love you” 以行的方式讀取D盤的test.txt檔案。程式碼如下:

#include<stdio.h>
int main(){
    char buf[128];	//字元陣列
    FILE *pfile=fopen("D:\\test.txt","r");	
    if(pfile){
        if(fgets(buf,128,pfile))
            printf("The read contend is:%s\n",buf);
        else 
            printf("Failed to read file.\n");
        fclose(pfile);
    }
    else
        printf("File opending failed.\n");
    return 0;
}

上面這兩種方式的寫入和讀取方式已經給出了完整的程式碼,可以自行選擇性的複製到本地自行驗證並體會

一般情況下,檔案的操作我們平時用的比較少,所以一些其他的高階操作我們就得在實際應用中去學習—— 需要用到某個知識點,我們就立即去學習它就行了,完全沒必要把所有的知識都學完了在去應用!

相關文章