Linux中的基础IO(一)
Linux中的基礎IO
文章目錄
- Linux中的基礎IO
- 一、C語言中的文件接口
- 二、隨機讀寫數據文件
- 三、文件讀寫的出錯檢測
一、C語言中的文件接口
寫在前面
- 計算機文件是以計算機硬盤為載體存儲在計算機上的信息集合,是存儲在某種長期儲存設備上的一段數據流。
- 在C語言中用一個指針變量指向一個文件,這個指針稱為文件指針。
- 通過文件指針就可對它所指的文件進行各種操作,C語言規定該文件指針類型為FILE型。
FILE文件指針結構體定義:
typedef struct {short level; // 緩沖區“滿”或“空”的程度unsigned flags; // 文件狀態標志char fd; // 文件描述符unsigned char hold; // 如緩沖區無內容不讀取字符short bsize; // 緩沖區的大小unsigned char *buffer; // 數據緩沖區的位置unsigned ar *curp; // 指針當前的指向unsigned istemp; // 臨時文件指示器short token; // 用于有效性檢查 }FILE;- 例如我們定義一個文件指針:FILE *fp; fp指向某一個文件的文件信息區(是一個結構體變量),通過該文件信息區就能夠訪問該文件。
- ps:文件緩沖區:緩沖文件系統是指系統自動地在內存區為程序中每一個正在使用的文件開辟一個文件緩沖區。從內存向磁盤輸出數據必須先送到內存中的緩沖區,裝滿緩沖區后才一起送到磁盤中去。
OK,接下來咱們認識一下C語言方面的文件操作接口。
-
1.打開和關閉文件
-
fopen 函數說明:
-
作用:用來打開一個文件
-
格式:FILE * fopen(const char * path,const char * mode);
-
返回值:打開文件成功返回一個文件指針,若打開文件失敗則返回NULL
-
參數說明:
上述的形態字符串都可以再加一個b字符,如rb、w+b或ab+等組合,加入b 字符用來告訴函數庫打開的文件為二進制文件,而非純文字文件。*
-
fclose 函數說明:
-
作用:關閉一個文件流,釋放文件指針
-
格式:int fclose( FILE *fp );
-
返回值:如果流成功關閉,fclose 返回 0,否則返回EOF
-
參數說明:
-
注:在文件操作完成后我們應該調用該函數來關閉文件,如果不關閉文件將可能會丟失數據。因為在向文件寫入數據時會先將數據輸出到緩沖區,待緩沖區充滿后才正式輸出給文件。
-
順序讀寫數據文件
-
fgetc 函數說明:
-
作用:從文件指針指向的文件流中讀取一個字符,讀取一個字節后,光標位置后移一個字節
-
格式:
-
返回值:返回所讀取的一個字節,如果讀到文件末尾或者讀取出錯時返回EOF(EOF是文件結束標識符,一般值為-1)
-
參數說明:
- fputc 函數說明:
-
作用:將指定字符寫到文件指針所指向的文件的當前寫指針位置上
-
格式:int fputc (char c, File *fp);
-
返回值:在正常調用情況下,函數返回寫入文件的字符的ASCII碼值,出錯時,返回EOF
-
參數說明:
-
fgets 函數說明:
-
例:
-
如果一個文件的當前位置的文本如下
- 如果用fgets(str1,6,file1);去讀取
- 而如果fgets(str1,23,file1);
-
作用:從文件結構體指針stream中讀取數據,每次讀取一行。
-
讀取的數據保存在buf指向的字符數組中,每次最多讀取bufsize-1個字符(第bufsize個字符賦’\0’),如果文件中的該行,不足bufsize個字符,則讀完該行就結束。
-
如若該行(包括最后一個換行符)的字符數超過bufsize-1,則fgets只返回一個不完整的行,但是,緩沖區總是以NULL字符結尾,對fgets的下一次調用會繼續讀該行。
-
返回值:函數成功將返回buf,失敗或讀到文件結尾返回NULL。因此我們不能直接通過fgets的返回值來判斷函數是否是出錯而終止的,應該借助feof函數或者ferror函數來判斷。
-
參數說明:
- fputs 函數說明:
-
作用:向指定的文件寫入一個字符串(不自動寫入字符串結束標記符‘\0’)
-
格式:int fputs(char *str, FILE *fp);
-
返回值:若成功返回0,失敗返回EOF
-
參數說明:
- fprintf 函數說明:
-
作用:格式化后輸出到文件中
-
格式:int fprintf (FILE* stream, const char* format, [argument]);
-
返回值:若成功返回值是輸出的字符數,當發生錯誤時返回一個負值
-
參數說明:
注:用法與printf函數類似,這里只是參數多了一個文件指針,將格式后的結果輸出到文件中
- fscanf 函數說明:
-
返回EOF如果讀取到文件結尾。
-
作用: 其功能為根據數據格式(format)從輸入流(stream)中讀入數據(存儲到argument);與fgets的差別在于:fscanf遇到空格和換行時結束,注意空格時也結束,fgets遇到空格不結束。
-
格式:int fscanf(FILE* stream,constchar* format,[argument]);
-
返回值:成功返回讀入的參數的個數,失敗返回EOF。
-
參數說明:
注:用法與scanf函數類似
- fread 函數說明:
- 作用:從一個文件流中讀數據,最多讀取count個元素,每個元素size字節
- 格式:size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
- 返回值:如果調用成功返回實際讀取到的元素個數,如果不成功或讀到文件末尾返回0
- 參數說明:
注:
這個函數以二進制形式對文件進行操作,不局限于文本文件- fwrite 函數說明:
-
作用:向文件寫入一個數據塊
-
格式:size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
-
返回值:返回實際寫入的數據塊數目
-
參數說明:
注:這個函數以二進制形式對文件進行操作,不局限于文本文件
二、隨機讀寫數據文件
- rewind 函數說明:
- 作用:將文件內部的位置指針重新指向一個流(數據流/文件)的開頭
- 格式:void rewind(FILE *stream);
- 返回值:無
- 參數說明:
- ftell 函數說明:
- 作用:得到文件位置指針當前位置相對于文件首的偏移字節數(測定文件位置標記的當前位置)
- 格式:long ftell(FILE *stream);
- 返回值:成功返回當前文件位置,失敗返回-1L
- 參數說明:
注:因為ftell返回long型,根據long型的取值范圍-231~231-1(-2147483648~2147483647),故對大于2.1G的文件進行操作時出錯。
- fseek 函數說明:
//ftell一般用于讀取文件的長度,結合fseek()讀取文本文件中的內容:
#include <stdio.h> #include <stdlib.h> int main() {FILE *fp;int flen;char *p;/* 以只讀方式打開文件 */ if((fp = fopen ("1.txt","r"))==NULL) {printf("\nfile open error\n");exit(0); }fseek(fp,0L,SEEK_END); /* 定位到文件末尾 */flen=ftell(fp); /* 得到文件大小 */p=(char *)malloc(flen+1); /* 根據文件大小動態分配內存空間 */if(p==NULL){fclose(fp);return 0;}fseek(fp,0L,SEEK_SET); /* 定位到文件開頭 */fread(p,flen,1,fp); /* 一次性讀取全部文件內容 */p[flen]='\0'; /* 字符串結束標志 */printf("%s",p);fclose(fp);free(p);return 0; }- 作用:重定位流(數據流/文件)上的文件內部位置指針
- 格式:int fseek(FILE *stream, long offset, int origin);
- 返回值:成功返回0,失敗返回非0值
- 參數說明:
示例:
fseek(fp,100L,0); // 把位置指針移動到離文件開頭100字節處 fseek(fp,100L,1); // 把位置指針移動到離文件當前位置100字節處 fseek(fp,-100L,2); // 把位置指針退回到離文件結尾100字節處三、文件讀寫的出錯檢測
-
ferror 函數說明:
-
作用:在調用各種輸入輸出函數(如 putc、getc、fread、fwrite等)時,如果出現錯誤,除了函數返回值有所反映外,還可以用ferror函數檢查
-
格式:int ferror(FILE *stream);
-
返回值:返回0表示未出錯,返回非0值表示出錯
-
參數說明:
-
clearerr 函數說明:
-
作用:使文件錯誤標志和文件結束標志置為0。假設在調用一個輸入輸出函數時出現了錯誤,ferror函數值為一個非零值。在調用clearerr(fp)后,ferror(fp)的值變為0。只要出現錯誤標志,就一直保留,直到對同一文件調用clearerr函數或rewind函數,或任何其他一個輸入輸出函數。
-
格式:void clearerr(FILE *stream);
-
返回值:無
-
參數說明:
補充:clearerr函數的作用是清除由stream指向的文件流的文件尾標識和錯誤標識。它沒有返回值,也未定義任何錯誤。你可以通過使用它從文件流的錯誤狀態中恢復。
綜合ferror()和clearerr()的使用,舉個例子:
#include<stdio.h> int main(void) {FILE*stream;/*openafileforwriting*/stream=fopen("DUMMY.FIL","w");/*forceanerrorconditionbyattemptingtoread*/(void)getc(stream);if(ferror(stream))/*testforanerroronthestream*/{/*displayanerrormessage*/printf("ErrorreadingfromDUMMY.FIL\n");/*resettheerrorandEOFindicators*/clearerr(stream);}fclose(stream);return0; }總結
以上是生活随笔為你收集整理的Linux中的基础IO(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下编写UDP/TCP版本的服务
- 下一篇: Linux中的基础IO(二)