天天看點

matlab中fgets,fgets(),fscanf(),fprintf()

功能

從檔案結構體指針stream中讀取資料,每次讀取一行。讀取的資料儲存在buf指向的字元數組中,每次最多讀取bufsize-1個字元(第bufsize個字元賦'\0'),如果檔案中的該行,不足bufsize個字元,則讀完該行就結束。如若該行(包括最後一個換行符)的字元數超過bufsize-1,則fgets隻傳回一個不完整的行,但是,緩沖區總是以NULL字元結尾,對fgets的下一次調用會繼續讀該行。函數成功将傳回buf,失敗或讀到檔案結尾傳回NULL。是以我們不能直接通過fgets的傳回值來判斷函數是否是出錯而終止的,應該借助feof函數或者ferror函數來判斷

函數原型

char *fgets(char *buf, int bufsize, FILE *stream);

*buf:字元型指針,指向用來存儲所得資料的位址。

bufsize: 整型資料,指明存儲資料的大小。

*stream: 檔案結構體指針,将要讀取的檔案流。

stream檔案流指針體指向檔案内容位址的偏移原則

如果使用fgets()讀取某個檔案,第一次讀取的bufsize為5,而檔案的第一行有10個字元(算上'\n'),那麼讀取檔案的指針會偏移至目前讀取完的這個字元之後的位置。也就是第二次再用fgets()讀取檔案的時候,則會繼續讀取其後的字元。而,如果使用fgets() 讀取檔案的時候bufsize大于該行的字元總數加2(多出來的兩個,一個儲存檔案本身的'\n'換行,一個儲存字元串本身的結束辨別'\0'),檔案并不會繼續讀下去,僅僅隻是這一行讀取完,随後指向檔案的指針會自動偏移至下一行。

例子

如果一個檔案的目前位置的文本如下

Love, I Have

Since you can do it.

如果用fgets(str1,6,file1);去讀取

則執行後str1 = "Love," ,讀取了6-1=5個字元

這個時候再執行fgets(str1,20,file1)則執行後str1 = " I Have\n"

而如果

fgets(str1,23,file1);

則執行str1="Love ,I Have",讀取了一行(包括行尾的'\n',并自動加上字元串結束符'\0'),目前檔案位置移至下一行,雖然23大于目前行上字元總和,可是不會繼續到下一行。而下一次調用fgets()繼續讀取的時候是從下一行開始讀。

從 handle 指向的檔案中讀取一行并傳回長度最多為 length - 1 位元組的字元串。碰到換行符(包括在傳回值中)、EOF 或者已經讀取了 length - 1 位元組後停止(看先碰到那一種情況)。如果沒有指定 length,則預設為 1K,或者說 1024 位元組。

出錯時傳回 FALSE。

②fscanf()

功 能:

從一個流中執行格式化輸入,fscanf遇到空格和換行時結束,注意空格時也結束。這與fgets有差別,fgets遇到空格不結束。

用 法: int fscanf(FILE *stream, char *format,[argument...]);

int fscanf(檔案指針,格式字元串,輸入清單);

常用基本參數對照:

%d:讀入一個十進制整數.

%i :讀入十進制,八進制,十六進制整數,與%d類似,但是在編譯時通過資料前置來區分進制,如加入“0x”則是十六進制,加入“0”則為八進制。例如串“031”使用%d時會被算作31,但是使用%i時會算作25.

%u:讀入一個無符号十進制整數.

%f %F %g %G : 用來輸入實數,可以用小數形式或指數形式輸入.

%x %X: 讀入十六進制整數.

%o': 讀入八進制整數.

%s : 讀入一個字元串,遇空格結束。

%c : 讀入一個字元。無法讀入空值。空格可以被讀入。

fprintf()

fprintf是C/C++中的一個格式化寫-庫函數,位于頭檔案中,其作用是格式化輸出到一個流/檔案中;函數原型為int fprintf( FILE *stream, const char *format, [ argument ]...),fprintf()函數根據指定的格式(format)向輸出流(stream)寫入資料(argument)。

2.fprintf(stdout,“hello world\n”)