如何系統學習C 語言(下)之 文件篇

我們所編寫的程式源程式碼以及編譯生成的可執行文件都屬於文件。所以文件的實質就是存儲在外部存儲介質上的一段連續的二進位數據。

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;
}

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

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