幾乎每乙個專案都有乙個日誌記錄功能,用於記錄軟體執行的情況方便日後的審計與審查。而日誌記錄就涉及到了檔案的讀寫操作。因此,本文對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 從記憶體向磁碟輸入資料會先送到記憶體中的緩衝區,裝滿緩衝區之後才一起送到...