檔案標準標準IO與檔案IO 的區別

2021-09-06 09:46:22 字數 4348 閱讀 4419

首先宣告,我是乙個菜鳥。一下文章中出現技術誤導情況蓋不負責

先來了解下什麼是標準io以及檔案io。

標準io:標準i/o是ansi c建立的乙個標準i/o模型,是乙個標準函式包和stdio.h標頭檔案中的定義,擁有必定的可移植性。標準io庫處理很多細節。例如快取分配,以優化長度執行io等。標準的io供給了三種型別的快取。

(1)全快取:當填滿標準io快取後才停止現實的io操作。

(2)行快取:當輸入或輸出中碰到新行符時,標準io庫執行io操作。

(3)不帶快取:stderr就是了。

檔案io:檔案io稱之為不帶快取的io(unbuffered i/o)。不帶快取指的是每乙個read,write都呼叫核心中的乙個系統呼叫。也就是一般所說的低階i/o——作業系統供給的基本io服務,與os繫結,特定於linix或unix平台。

2區別首先:兩者乙個明顯的不同點在於,標準i/o預設採取了緩衝機制,比如呼叫fopen函式,不僅開啟乙個檔案,而且建立了乙個緩衝區(讀寫模式下將建立兩個緩衝區),還建立了乙個包含檔案和緩衝區相干資料的資料結構。低階i/o一般沒有採取緩衝,須要自己建立緩衝區,不過其實在linix或unix系統中,都是有應用稱為核心緩衝的技術用於提高效率,讀寫呼叫是在核心緩衝區和程序緩衝區之間停止的資料複製。

其次從操作的裝置上來區分,檔案i/o重要針對檔案操作,讀寫硬碟等,它操作的是檔案描述符,標準i/o針對的是控制台,列印輸出到螢幕等,它操作的是字元流。對於不同裝置得特性不一樣,必須有不同api訪問才最高效。

最後來看下他們應用的函式

標準io

檔案io(低階io)

開啟fopen,freopen,fdopen

open

關閉fclose

close

讀getc,fgetc,getchar

fgets,gets

fread

read

寫putc,fputc,putchar

fputs,puts,

fwrite

write

1.fopen與open

標準i/o應用fopen函式開啟乙個檔案:

file* fp=fopen(const char* path,const char *mod)

其中path是檔名,mod用於指定檔案開啟的模式的字串,比如"r","w","w+","a"等等,可以加上字母b用以指定以二進位制模式開啟(對於 *nix系統,只有一種檔案型別,因此沒有區別),如果勝利開啟,返回乙個file檔案指標,如果失敗返回null,這裡的檔案指標並非指向現實的文 件,而是乙個關於檔案資訊的資料報,其中包含檔案應用的緩衝區資訊。

檔案io應用open函式用於開啟乙個檔案:

int fd=open(char *name,int how);

每日一道理

微笑著,去唱生活的歌謠,不要埋怨生活給予了太多的磨難,不必抱怨生命中有太多的曲折。大海如果失去了巨浪的翻滾,就會失去雄渾;沙漠如果失去了飛沙的狂舞,就會失去壯觀。人生如果僅去求得兩點一線的一帆風順,生命也就失去了存在的意義。

與fopen類似,name表現檔名字串,而how指定開啟的模式:o_rdonly(唯讀),o_wronly(只寫),o_rdwr (可讀可寫),還有其他模式請man 2 open。勝利返回乙個正整數稱為檔案描述符,這與標準i/o明顯不同,失敗的話返回-1,與標準i/o返回null也是不同的。

2.fclose與close

與開啟檔案相對的,標準i/o應用fclose關閉檔案,將檔案指標傳入便可,如果勝利關閉,返回0,否則返回eof

比如:if(fclose(fp)!=0)  

printf("error in closing file");

而檔案io應用close用於關閉open開啟的檔案,與fclose類似,只不過當錯誤產生時返回的是-1,而不是eof,勝利關閉同樣是返回0。c語言用error code來停止錯誤處理的傳統做法。

3. 讀檔案getc,fscanf,fgets和read

標 準i/o中停止檔案讀取可以應用getc,乙個字元乙個字元的讀取,也可以應用gets(讀取標準io讀入的)、fgets以字串單位停止讀取(讀到遇 到的第乙個換行字元的後面),gets(接受乙個引數,檔案指標)不判斷目標陣列是否可以容納讀入的字元,可能導致儲存溢位(不提議應用),而fgets應用三個引數:

char * fgets(char *s, int size, file *stream);

第乙個引數和gets一樣,用於儲存輸入的位址,第二個引數為整數,表現輸入字串的最大長度,最後乙個引數就是檔案指標,指向要讀取的檔案。最 後是fscanf,與scanf類似,只不過增加了乙個引數用於指定操作的檔案,比如fscanf(fp,"%s",words)

檔案io中應用read函式用於讀取open函式開啟的檔案,函式原型如下:

ssize_t numread=read(int fd,void *buf,size_t qty);

其中fd就是open返回的檔案描述符,buf用於儲存資料的目的緩衝區,而qty指定要讀取的位元組數。如果勝利讀取,就返回讀取的位元組數目(小於即是qty)

4. 判斷檔案結尾

如果實驗讀取到達檔案結尾,標準io的getc會返回特別值eof,而fgets碰到eof會返回null,而對於*nix的read函式,情況有所不 同。read讀取qty指定的位元組數,最終讀取的資料可能沒有你所要求的那麼多(qty),而當讀到結尾再要讀的話,read函式將返回0.

5. 寫檔案putc,fputs,fprintf和write

與讀檔案相對應的,標準c語言i/o應用putc寫入字元,比如:

putc(ch,fp);

第乙個引數是字元,第二個是檔案指標。而fputs與此類似:

fputs(buf,fp);

fprintf(stdout,"hello %s.\n","dennis");

切記fscanf和fprintf將file指標作為第乙個引數,而putc,fputs則是作為第二個引數。

在檔案io中供給write函式用於寫入檔案,原型與read類似:

ssize_t result=write(int fd,void *buf ,size_t amt);

fd是檔案描述符,buf是將要寫入的記憶體資料,amt是要寫的位元組數。如果寫入勝利返回寫入的位元組數,通過result與amt的比擬可以判斷是否寫入正常,如果寫入失敗返回-1

6. 隨機訪問fseek()、ftell()和lseek()

標準i/o應用fseek和ftell用於檔案的隨機訪問,先看看fseek函式原型

int fseek(file *stream, long offset, int whence);

第乙個引數是檔案指標,第二個引數是乙個long型別的偏移量(offset),表現從起始點開始挪動的距離。第三個引數就是用於指定起始點的模式,stdio.h指定了下列模式常量:

seek_set            檔案開始處

seek_cur            當前位置

seek_end            檔案結尾處

看幾個呼叫例子:

fseek(fp,0l,seek_set); //找到檔案的開始處

fseek(fp,0l,seek_end); //定位到檔案結尾處

fseek(fp,2l,seek_cur); //檔案當前位置向前挪動2個位元組數

而ftell函式用於返回檔案的當前位置,返回型別是乙個long型別,比如上面的呼叫:

fseek(fp,0l,seek_end);//定位到結尾

long last=ftell(fp); //返回當前位置

那麼此時的last就是檔案指標fp指向的檔案的位元組數。

與標準i/o類似,*nix系統供給了lseek來實現fseek的功能,原型如下:

off_t lseek(int fildes, off_t offset, int whence);

fildes是檔案描述符,而offset也是偏移量,whence同樣是指定起始點模式,唯一的不同是lseek有返回值,如果勝利就 返回指標變化前的位置,否則返回-1。whence的取值與fseek相同:seek_set,seek_cur,seek_end,但也可以用整數 0,1,2相應代替。

文章結束給大家分享下程式設計師的一些笑話語錄: 愛情觀

愛情就是死迴圈,一旦執行就陷進去了。

愛上乙個人,就是記憶體洩露--你永遠釋放不了。

真正愛上乙個人的時候,那就是常量限定,永遠不會改變。

女朋友就是私有變數,只有我這個類才能呼叫。

情人就是指標用的時候一定要注意,要不然就帶來巨大的災難。

標準IO與檔案IO 的區別

先來了解下什麼是標準 以及檔案 標準 標準i o是ansi c建立的乙個標準i o模型,是乙個標準函式包和stdio.h標頭檔案中的定義,具有一定的可移植性。標準io庫處理很多細節。例如快取分配,以優化長度執行io等。標準的io提供了三種型別的快取。1 全快取 當填滿標準io快取後才進行實際的io操...

標準IO與檔案IO 的區別

先來了解下什麼是標準 以及檔案 標準 標準i o是ansi c建立的乙個標準i o模型,是乙個標準函式包和stdio.h標頭檔案中的定義,具有一定的可移植性。標準io庫處理很多細節。例如快取分配,以優化長度執行io等。標準的io提供了三種型別的快取。1 全快取 當填滿標準io快取後才進行實際的io操...

標準IO與檔案IO 的區別

標準i o是ansi c建立的乙個標準i o模型,是乙個標準函式包和stdio.h標頭檔案中的定義,具有一定的可移植性。標準io庫處理很多細節。例如快取分配,以優化長度執行io等。標準的io提供了三種型別的快取。1 全快取 當填滿標準io快取後才進行實際的io操作。2 行快取 當輸入或輸出中遇到新行...