UNIX 環境高階程式設計 標準IO 未完

2021-07-26 08:14:24 字數 3581 閱讀 2245

函式原型:file * fopen(const char * path,const char * mode);

函式功能 : 開啟乙個檔案;

函式引數:path:字串包含欲開啟的檔案路徑及檔名

mode:字串則代表著流形態。包含下面的幾種模式

mode有下列幾種形態字串:

r : 以唯讀方式開啟檔案,該檔案必須存在。

r+ : 以可讀寫方式開啟檔案,該檔案必須存在。

w : 開啟只寫檔案,若檔案存在則檔案長度清為0,即該檔案內容會消 失。若檔案不存在則建立該檔案。

w+ : 開啟可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案。

a : 以附加的方式開啟只寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的內容會被保留。(eof符保留)

a+:以附加方式開啟可讀寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即檔案原先的內容會被保留。 (原來的eof符不保留)

有些c編譯系統可能不完全提供所有這些功能,有的c版本不用」r+」,」w+」,」a+」,而用」rw」,」wr」,」ar」等,讀者注意所用系統的規定。

返回值 : 檔案順利開啟後,指向該流的檔案指標就會被返回。如果檔案開啟失敗則返回null,並把錯誤**存在errno中。

一般而言,開啟檔案後會做一些檔案讀取或寫入的動作,若開啟檔案失敗,接下來的讀寫動作也無法順利進行,所以一般在fopen()後作錯誤判斷及處理。

二進位制和文字模式的區別

1.在windows系統中,文字模式下,檔案以」\r\n」代表換行。若以文字模式開啟檔案,並用fputs等函式寫入換行符」\n」時,函式會自動在」\n」前面加上」\r」。即實際寫入檔案的是」\r\n」 。

2.在類unix/linux系統中文字模式下,檔案以」\n」代表換行。所以linux系統中在文字模式和二進位制模式下並無區別。

fclose();

函式原型:int fclose( file *fp );

函式功能:關閉乙個流。注意:使用fclose()函式就可以把緩衝區內最後剩餘的資料輸出到核心緩衝區,並釋放檔案指標和有關的緩衝區。

函式引數:fp:開啟檔案fclose( )時獲得的檔案指標;

返回值:如果流成功關閉,fclose 返回 0,否則返回eof(-1)。(如果流為null,而且程式可以繼續執行,fclose設定error number給einval,並返回eof。)

fgetc();

函式原型:int fgetc(file *stream);

函式功能:從流中讀取字元

函式引數:stream:檔案流

返回值:返回所讀取的乙個位元組。如果讀到檔案末尾或者讀取出錯時返回eof。

函式說明:fgetc()從引數stream所指的檔案中讀取乙個字元,並把它作為乙個字元返回。若讀到檔案尾或出現錯誤時,它就返回eof,你必須通過ferror或feof來區分這兩種情況。

fputc();

函式原型:int fputc (char ch, file *fp);

函式功能:將字元ch寫到檔案指標fp所指向的檔案的當前寫指標的位置。

函式引數:ch:寫入的字元;

fp: fopen()開啟開的檔案指標;

函式返回值:在正常呼叫情況下,函式返回寫入檔案的字元的ascii碼值,出錯時,返回eof(-1)。當正確寫入乙個字元或乙個位元組的資料後,檔案內部寫指標會自動後移乙個位元組的位置。

fgets();

函式原型:char *fgets(char *buf, int bufsize, file *stream);

函式功能:

函式引數:

返回值:

函式說明:從檔案結構體指標stream中讀取資料,每次讀取一行。讀取的資料儲存在buf指向的字元陣列中,每次最多讀取bufsize-1個字元(第bufsize個字元賦』\0』),如果檔案中的該行,不足bufsize個字元,則讀完該行就結束。如若該行(包括最後乙個換行符)的字元數超過bufsize-1,則fgets只返回乙個不完整的行,但是,緩衝區總是以null字元結尾,對fgets的下一次呼叫會繼續讀該行。函式成功將返回buf,失敗或讀到檔案結尾返回null。因此我們不能直接通過fgets的返回值來判斷函式是否是出錯而終止的,應該借助feof函式或者ferror函式來判斷。

fgets()停止讀取的情況:

fgets讀取了 bufsize -1 字元:

fgets()讀取到了 『\n』:

fgets幾種讀取情況:

例子:

偽碼:

#include <.../.h>

#define maxsize 5

char buf[maxsize]

fgets(buf,maxsize,stream);

1.需要讀取的字元數 < 5

檔案流:123

第一次讀取:123

'\n'

'\0'

2.需要讀取的字元數 >= 5

檔案流:1234567

第一次讀取:1234

'\0'

第二次讀取: 567

'\n'

'\0'

3.需要讀取的字元數 = 5 - 1

檔案流: 1234

第一次讀取:1234

'\0'

第二次讀取:'\n'

'\0'

fputs();

函式原型: int fputs(char * string, file * stream);

函式功能:將字串寫入到指定的流中

函式引數:

string:需要寫入的引數字串所在的位址

stream: 需要寫入的流

函式返回值 :成功寫入乙個字串後,檔案的位置指標會自動後移,函式返回值為非負整數;否則返回eof

函式說明:

fputs()從string的開頭往檔案寫入字串,直到遇見結束符 『\0』,』\0』 不會被寫入到檔案中。

fread();

函式原型:size_t fread(void buffer, size_t size, size_t count, file stream);

函式功能:fread()函式用於從檔案流中讀取資料,讀取完後檔案流的位置指標後移 size * count 位元組。

函式引數:

buffer:為接收資料的位址

size:為乙個單元的大小

count:為單元個數

stream:為檔案流

函式返回值:返回真實寫入的項數,若大於count則意味著產生了錯誤。另外,產生錯誤後,檔案位置指示器是無法確定的。若其他stream或buffer為空指標,或在unicode模式中寫入的位元組數為奇數,此函式設定errno為einval以及返回0.

函式說明:

fwrite();

函式原型:size_t fread(void *restrict ptr, size

printf();

scanf();

fseek();

ftell();

rewind();

fflush();

unix環境高階程式設計 標準IO

標準io庫 不僅在unix上,在很多作業系統上都實現了標準的io庫,它處理了很多細節,例如緩衝區分配,優化長度執行io等。流和file物件 對於標準的io庫,它們的操作是圍繞流 stream 進行的。當用標準io庫開啟或建立乙個檔案時,已經使乙個流和乙個檔案相關聯,標準的io檔案流可用於單位元組和多...

Unix環境高階程式設計 三 標準I O庫

標準i o庫是iso c的標準,在很多作業系統上面都實現。unix檔案i o函式都是針對檔案描述符的,當開啟乙個檔案的時候,返回該檔案描述符用於後續的i o操作。而對於標準i o庫,操作則是圍繞流進行,當用標準i o庫開啟或者建立乙個檔案時,使得乙個流與檔案相關聯。標準i o庫使用了緩衝技術,使用緩...

《UNIX環境高階程式設計》 I O

不帶緩衝i o open read write lseek close等 標準i o 帶緩衝 fopen fclose fgets fputs fgetc fputc fwrite fread 標準i o對每個i o流自動進行快取管理 標準i o函式通常呼叫malloc來分配快取 它提供了三種型別的...