C語言檔案操作總結

2021-09-30 16:21:46 字數 4576 閱讀 4634

幾乎每乙個專案都有乙個日誌記錄功能,用於記錄軟體執行的情況方便日後的審計與審查。而日誌記錄就涉及到了檔案的讀寫操作。因此,本文對c語言下的檔案操作進行了總結。

fopen用來開啟檔案。

file* fopen(const

char* name, const

char* mode);

name:是要開啟檔案的檔名指標

mode:表示了對開啟檔案的操作方式。

例項程式如下:

file *fp;  

if((fp=fopen("/proc/cpuinfo","r"))==null)

else

printf("file opened for reading/n");

……

fclose(fp);

(1) fgetc、fputc介紹:

fgetc()函式:char ch=fgetc(fp); 將把流指標fp指向的檔案中的乙個字元讀出,並賦給ch,當執行fgetc()函式時,若當時檔案指標指到檔案尾,即遇到檔案結束標誌eof(其對應值為-1),該函式返回乙個-1給ch。所以,fgetc函式一直讀到檔案尾為止。

#include "stdio.h"   

#include

int main()

while((ch=fgetc(fp))!=eof)

fputc(ch,stdout);

fclose(fp);

}

fputc()函式,該函式將字元變數ch的值寫到流指標指定的檔案中去,由於流指標用的是標準輸出(顯示器)的file指標stdout,故讀出的字元將在顯示器上顯示。又比如: fputc(ch,fp); 該函式執行結構,將把ch表示的字元送到流指標fp指向的檔案中去。

(2) getchar()

1.getchar是以行為單位進行訪問的。

當用getchar進行輸入時,如果輸入的第乙個字元為有效字元,那麼只有當最後乙個輸入字元為換行符』\n』,getchar才會停止執行,整個程式將會往下執行。

對於getchar,肯定很多初學的朋友會問,getchar不是以字元為單位讀取的嗎?那麼,既然我輸入了第乙個字元a,肯定滿足while迴圈(c = getchar()) != eof的條件,那麼應該執行putchar(c)在終端輸出乙個字元a。不錯,我在用getchar的時候也是一直這麼想的,但是程式就偏偏不著樣執行,而是必需讀到乙個換行符或者檔案結束符eof才進行一次輸出。

對這個問題的乙個解釋是,在大師編寫c的時候,當時並沒有所謂終端輸入的概念,所有的輸入實際上都是按照檔案進行讀取的,檔案中一般都是以行為單位的。因此,只有遇到換行符,那麼程式會認為輸入結束,然後採取執行程式的其他部分。同時,輸入是按照檔案的方式訪問的,那麼要結束乙個檔案的輸入就需用到eof (enf of file). 這也就是為什麼getchar結束輸入退出時要用eof的原因。

2.getchar()的返回值一般情況下是字元,但也可能是負值,即返回eof。

這裡要強調的一點就是,getchar函式通常返回終端所輸入的字元,這些字元系統中對應的ascii值都是非負的。因此,很多時候,我們會寫這樣的兩行**:

char c;

c =getchar();

這樣就很有可能出現問題。因為getchar函式除了返回終端輸入的字元外,在遇到ctrl+d(linux下)即檔案結束符eof時,getchar ()的返回eof,這個eof在函式庫裡一般定義為-1。因此,在這種情況下,getchar函式返回乙個負值,把乙個負值賦給乙個char型的變數是不正確的。為了能夠讓所定義的變數能夠包含getchar函式返回的所有可能的值,正確的定義方法如下(k&r c中特別提到了這個問題):

int c;

c =getchar();

(3) getc、putc介紹:

getc()用於從流中取字元,其原型如下:

int

getc(file *stream);

若從乙個檔案中讀取乙個字元,讀到檔案尾而無資料時便返回eof。getc()與fgetc()作用相同,但在某些庫中getc()為巨集定義,而非真正的函式。

示例程式:

#include //引入標準輸入輸出庫

void main( )

getc、putc函式功能與fgetc、fputc函式功能相同。最大的區別在前者是巨集,後者是函式,其中fget前面的字母f即為function函式的意思。使用這兩個函式時,需要注意如下幾點。

1、getc的引數不應當是具有***的表示式。有***的表示式,指的是表示式執行後,會改變表示式中某些變數的值。比如++i * ++i。

2、因為fgetc一定是乙個函式,所以可以得到其位址。這就允許將fgetc的位址作為乙個引數傳送給另乙個函式。

3、呼叫fgetc所需時間很可能長於呼叫getc,因為呼叫函式通常所需的時間長於呼叫巨集。

#include "stdio.h"   

int main()

while(!feof(fp))

fclose(fp);

}

(2)gets()函式

gets()函式功能是從流中讀取字串。gets()函式從流中讀取字串,直到出現換行符或讀到檔案尾為止。

注意:由於gets()不檢查字串string的大小,必須遇到換行符或檔案結尾才會結束輸入,因此容易造成快取溢位的安全性問題,導致程式崩潰,可以使用fgets()代替。

(3)fputs()、 fprintf()、fscanf()

fputs()函式想指定檔案寫入乙個由string指向的字串,』/0』不寫入檔案。 fprintf()和fscanf()同printf()和scanf()函式類似,不同之處就是printf()函式是想顯示器輸出,fprintf()則是向流指標指向的檔案輸出;fscanf()是從檔案輸入。 下面程式是向檔案test.dat裡輸入一些字元:

#include 

#include

int main()

下面的程式是把上面的檔案test.dat裡的內容在螢幕上顯示出來:

#include 

int main()

前面介紹的檔案的字元/字串讀寫,均是進行檔案的順序讀寫,即總是從檔案的開頭開始進行讀寫。這顯然不能滿足我們的要求,c語言提供了移動檔案指標和隨機讀寫的函式,它們是:

(1).移動檔案指標函式:

(2).檔案隨機讀寫函式:

int fread(void *ptr,int size,int nitems,file *stream);

int fwrite(void *ptr,int size,int nitems,file *stream);

(1)寫int資料到檔案

#include 

#include

int main ()

; if((pfile = fopen ("myfile.txt", "wb"))==null)

//可以寫多個連續的資料(這裡一次寫4個)

fwrite (buffer , sizeof(int), 4, pfile);

fclose (pfile);

return

0;}

(2)讀取int資料

#include 

#include

int main ()

if(fread(buffer,sizeof(int),4,fp)!=4) //可以一次讀取

for(int i=0;i<4;i++)

printf("%d\n",buffer[i]);

return

0;}

(3)寫結構體資料到檔案

#include 

#include

#include

typedef

structpeople;

int main ()

for(i=0;i<3;i++)

fclose (pfile);

return

0;}

(4)讀結構體資料

#include 

#include

#include

typedef

structpeople;

int main ()

while(fread(&per,sizeof(people),1,fp)==1) //如果讀到資料,就顯示;否則退出

return

0;}

本文參考:

C語言檔案操作總結

文字模式 二進位制模式 c可以認識ctrl z為檔案結尾 c只會把ctrl z當做檔案中的乙個字元,真正的檔案結尾在後面 ms dos用 r n組合表示換行符,c將 r n看作 n程式將看到這兩個字元 此外,檔案的第乙個字元可能不是檔案的第乙個字元,所以用文字檔案開啟,ftell 可以返回正確的檔案...

C語言操作檔案總結

include stdio.h include malloc.h include 獲取檔案大小 long getsize char path return 1 fclose fp void readtxt char path 下面兩種方式本質都是分配乙個10位元組的儲存單元,然後宣告乙個字元指標指向...

C語言總結9 C語言檔案操作

磁碟上的檔案是檔案 檔案包含檔案內容和檔案屬性,都是資料,需要儲存 檔案分為程式檔案 源程式檔案 目標檔案 可執行程式檔案 和資料檔案 資料檔案分為文字檔案 以ascii碼的形式儲存 和二進位制檔案 以為二進位制的形式儲存 1 從記憶體向磁碟輸入資料會先送到記憶體中的緩衝區,裝滿緩衝區之後才一起送到...