概述
在C語言文件輸入和輸出操作的學(xué)習(xí)心得(二)已經(jīng)詳細介紹了C語言文件輸入的操作,但未介紹如何讀取文件的操作。本文針主要通過比較兩種文件讀出的方法向大家介紹C語言文件輸出的一些基本操作,并向大家提供兩個實例以供參考琅翻。
fgetc()
相關(guān)函數(shù):open, fread, fscanf, getc
頭文件:include<stdio.h>
原型:int fgetc(FILE * stream);
【說明】
fgetc()從參數(shù)stream 所指的文件中讀取一個字符. 若讀到文件尾而無數(shù)據(jù)時便返回EOF诺祸。此函數(shù)與前文提及到的getchar()類似。
【返回值】
fgetc()會返回讀取到的字符, 若返回EOF 則表示到了文件尾
stdout
stdout(standardoutput)標(biāo)準輸出获询,不是一個函數(shù),而是一個由C語言的頭文件已經(jīng)定好并且可以直接使用的文件指針拐袜。只是方便操作輸出吉嚣,比如傳給一個函數(shù)等等。這時函數(shù)的輸出就不是輸出到文件蹬铺,而是傳進來的stdout文件指針尝哆,即標(biāo)準輸出。
實例1
#include <stdio.h>
int main()
{
FILE *pFile;
char c;
pFile = fopen("test.txt", "r");
if(pFile == NULL)//文件指針為空時的措施
{
printf("can not open the file");
fclose(pFile);
return 0;
}
while(c!=EOF)
{
c = fgetc(pFile);//獲取文件的字符
fputc(c,stdout);//顯示讀取的單個字符
}
fclose(pFile);//關(guān)閉文件
return 0;
}
【說明】
細心的讀者會發(fā)現(xiàn)以上這個實例甜攀,和前文(二)的實例相似度很高秋泄。不同之處在于fopen()函數(shù)中的模式換成了讀取模式(r);fputc()函數(shù)中,文件流的參數(shù)換成了stdout规阀。把讀取到的字符放進標(biāo)準輸出以后恒序,系統(tǒng)會把這些字符打印出來,從而起到了讀取的功能谁撼。
fgets()
相關(guān)函數(shù):open, fread, fscanf, getc
頭文件:include<stdio.h>
原型:har * fgets(char * s, int size, FILE * stream);
【參數(shù)】
s:字符型指針歧胁,指向用來存儲字符的數(shù)組
size:存儲數(shù)據(jù)的大小
stream:數(shù)據(jù)的來源文件
【說明】
fgets()用來從參數(shù)stream 所指的文件內(nèi)讀入字符并存到參數(shù)s 所指的內(nèi)存空間, 直到出現(xiàn)換行字符、讀到文件尾或是已讀了size-1 個字符為止, 最后會加上NULL 作為字符串結(jié)束.
【返回值】
fgets()若成功則返回s 指針, 返回NULL 則表示有錯誤發(fā)生
fputs()
相關(guān)函數(shù):fopen, fwrite, fscanf, fputc, putc
頭文件:#include <stdio.h>
原型:int fputs(const char * s, FILE * stream);
【說明】
fputs()用來將參數(shù)s 所指的字符串寫入到參數(shù)stream 所指的文件內(nèi).
【返回值】
若成功則返回寫出的字符個數(shù), 返回EOF 則表示有錯誤發(fā)生.
feof()
相關(guān)函數(shù):fopen, fgetc, fgets, fread
頭文件:#include <stdio.h>
原型:int feof(FILE * stream);
【說明】
feof()用來偵測是否讀取到了文件尾, 尾數(shù)stream 為fopen()所返回之文件指針. 如果已到文件尾則返回非零值, 其他情況返回0.
【返回值】
返回非零值代表已到達文件尾.
實例2
#include <stdio.h>
int main()
{
FILE *pFile;
char c[32];//定義一個長度為32的字符數(shù)組
pFile = fopen("test.txt", "r");
if(pFile == NULL)//文件指針為空時的措施
{
printf("can not open the file");
fclose(pFile);
return 0;
}
while(!feof(pFile))
{
fgets(c,32,pFile);//一次從文件中讀取32個字節(jié)
fputs(c,stdout);//一次顯示32個字節(jié)
}
fclose(pFile);//關(guān)閉文件
return 0;
}
【說明】
實例2和實例1的形式相似厉碟。采用feof()函數(shù)判別文件是否結(jié)束喊巍,讀取文件和輸出文件分別采用fgets()函數(shù)和fputs()函數(shù),其特點是一次可從文件中讀取32字節(jié)箍鼓。事實上崭参,一次讀取多少位數(shù)據(jù)可以根據(jù)開發(fā)者的需要改變size和存儲數(shù)據(jù)。
二者比較
實例1和實例2雖然形式相似袄秩,但是它們之間最大的區(qū)別是程序的效率阵翎,這種效率區(qū)別尤其在讀取大量數(shù)據(jù)時能夠體現(xiàn)。
實例1采用fgetc()函數(shù)之剧,每次只能讀取1個字符郭卫,一次循環(huán)只能讀取1個字符。實例2采用fgets()函數(shù)背稼,每次能讀取32個字符贰军,一次循環(huán)能夠讀取32個字符。假如一個txt文件有3200個字節(jié),采用fgetc()需要執(zhí)行3200次循環(huán)词疼,而采用fgets()只需執(zhí)行1000次循環(huán)俯树。舉一個例子,如果將一個字符比作一個水滴贰盗,一個字符串比作一個水杯许饿,一個文本文件比作一桶水。我們要用最短時間抽干這桶水舵盈,是用杯子快還是一滴一滴流快呢陋率?
那么是不是我們把儲存字符的數(shù)組定義得越大越好呢?其實也未必秽晚,因為定義一個數(shù)組的實質(zhì)是在內(nèi)存劃分一塊區(qū)域用來儲存數(shù)據(jù)瓦糟。在內(nèi)存有限的時候我們分配內(nèi)存時必須謹慎,不然會出現(xiàn)很多意想不到的bug赴蝇。定義存儲數(shù)組的長度需要根據(jù)效率以及內(nèi)存空間選擇一個折中的值菩浙。
其實,實現(xiàn)讀取文件的實例還有很多句伶,本文只提供其中兩個實例作為參考劲蜻。如有其他實例,歡迎各位朋友前來交流考余。