標準IO與檔案IO 的區別【轉】

來源:互聯網
上載者:User

標籤:

本文轉載自:http://blog.sina.com.cn/s/blog_63f31f3401013jrn.html

先來瞭解下什麼是標準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與printf類似,增加了一個參數用於指定寫入的檔案,比如:

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 的區別【轉】

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.