如何系統學習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;
}

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM