日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux中的基础IO(一)

發布時間:2024/4/11 linux 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 函數說明:

#include <stdio.h> #define F_PATH "d:\\myfile\\file.dat"int main(void) {FILE *fp = NULL; /* 需要注意 */fp = fopen(F_PATH, "r");if (NULL == fp){return -1; /* 要返回錯誤代碼 */}fclose(fp);fp = NULL; /* 需要指向空,否則會指向原打開文件地址 */return 0; }
  • 作用:用來打開一個文件

  • 格式:FILE * fopen(const char * path,const char * mode);

  • 返回值:打開文件成功返回一個文件指針,若打開文件失敗則返回NULL

  • 參數說明:

*path:字符串包含欲打開的文件路徑及文件名(例如:D:\\A.txt),注意在C語言中欲輸出一個"\"則需要輸兩個"\\" *mode:代表著流形態,mode有下列幾種形態字符串:r 打開只讀文件,該文件必須存在。 r+ 打開可讀寫的文件,該文件必須存在。 rb+ 讀寫打開一個二進制文件,只允許讀寫數據。rt+ 讀寫打開一個文本文件,允許讀和寫。 w 打開只寫文件,若文件存在則文件長度清為0,即該文件內容會消失。若文件不存在則建立該文件。 w+ 打開可讀寫文件,若文件存在則文件長度清為零,即該文件內容會消失。若文件不存在則建立該文件。a 以附加的方式打開只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾,即文件原先的內容會被保留。(EOF符保留)a+ 以附加方式打開可讀寫的文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾后,即文件原先的內容會被保留。(原來的EOF符不保留)wb 只寫打開或新建一個二進制文件;只允許寫數據。wb+ 讀寫打開或建立一個二進制文件,允許讀和寫。 wt+ 讀寫打開或著建立一個文本文件;允許讀寫。 at+ 讀寫打開一個文本文件,允許讀或在文本末追加數據。 ab+ 讀寫打開一個二進制文件,允許讀或在文件末追加數據。

上述的形態字符串都可以再加一個b字符,如rb、w+b或ab+等組合,加入b 字符用來告訴函數庫打開的文件為二進制文件,而非純文字文件。*

  • fclose 函數說明:

  • 作用:關閉一個文件流,釋放文件指針

  • 格式:int fclose( FILE *fp );

  • 返回值:如果流成功關閉,fclose 返回 0,否則返回EOF

  • 參數說明:

*fp:需要關閉的文件指針
  • 注:在文件操作完成后我們應該調用該函數來關閉文件,如果不關閉文件將可能會丟失數據。因為在向文件寫入數據時會先將數據輸出到緩沖區,待緩沖區充滿后才正式輸出給文件。

  • 順序讀寫數據文件

  • fgetc 函數說明:

#include<stdio.h> void main() {FILE *fp;int c;fp=fopen("exist","r");while((c=fgetc(fp))!=EOF)printf("%c",c);fclose(fp); }
  • 作用:從文件指針指向的文件流中讀取一個字符,讀取一個字節后,光標位置后移一個字節

  • 格式:

int fgetc(FILE *stream);
  • 返回值:返回所讀取的一個字節,如果讀到文件末尾或者讀取出錯時返回EOF(EOF是文件結束標識符,一般值為-1)

  • 參數說明:

*stream:文件指針,從該文件指針指向的文件中讀取一個字符,然后將光標后移一個字節
  • fputc 函數說明:
#include <stdio.h> #include <string.h> int main(void) {char msg[]="Hello world";int i=0;while(msg[i]&&(i<strlen(msg))){fputc(msg[i],stdout);i++;}return 0; }
  • 作用:將指定字符寫到文件指針所指向的文件的當前寫指針位置上

  • 格式:int fputc (char c, File *fp);

  • 返回值:在正常調用情況下,函數返回寫入文件的字符的ASCII碼值,出錯時,返回EOF

  • 參數說明:

c:需要寫入的字符*fp:文件指針,在當前文件指針所指向的文件的當前寫指針位置上寫入一個字符c, 然后文件內部寫指針會自動后移一個字節位置
  • fgets 函數說明:

  • 例:

  • 如果一個文件的當前位置的文本如下

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()繼續讀取的時候是從下一行開始讀。 格式: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函數來判斷。

  • 參數說明:

*buf: 字符型指針,指向用來存儲所得數據的地址。 bufsize: 整型數據,指明存儲數據的大小。 *stream: 文件指針,將要讀取的文件流。
  • fputs 函數說明:
#include<stdio.h> #include<stdlib.h> int main() {char str[80]="asdhfdf\n";FILE *fp = NULL;if((fp=fopen("strfile.txt","w"))==NULL){printf("cannot open file\n");exit(0);}fputs(str,fp);//putchar(str);fclose(fp);fp = NULL;return 0; }
  • 作用:向指定的文件寫入一個字符串(不自動寫入字符串結束標記符‘\0’)

  • 格式:int fputs(char *str, FILE *fp);

  • 返回值:若成功返回0,失敗返回EOF

  • 參數說明:

*str: 需要寫入的字符串 *fp: 文件指針,將要寫入的文件流
  • fprintf 函數說明:
//... #include <cstdio> int main(void) {FILE *FSPOINTER;char STRBUFF[16] = "Hello World.";//...FSPOINTER = fopen("HELLO.TXT", "w+");//...fprintf(FSPOINTER, "%s", STRBUFF);//...return 0; } 輸出至文件HELLO.TXT: Hello World
  • 作用:格式化后輸出到文件中

  • 格式:int fprintf (FILE* stream, const char* format, [argument]);

  • 返回值:若成功返回值是輸出的字符數,當發生錯誤時返回一個負值

  • 參數說明:

*stream:文件指針*format:輸出格式[argument]:附加參數列表

注:用法與printf函數類似,這里只是參數多了一個文件指針,將格式后的結果輸出到文件中

  • fscanf 函數說明:
#include <stdlib.h> #include <stdio.h> int main(void) {int i;printf("Input an integer:");/*從標準輸入中讀取一個整數*/if(fscanf(stdin, "%d",&i))printf("The integer read was:%d\n", i);else{fprintf(stderr, "Error reading an integer from stdin.\n");exit(1);}return 0; }
  • 返回EOF如果讀取到文件結尾。

  • 作用: 其功能為根據數據格式(format)從輸入流(stream)中讀入數據(存儲到argument);與fgets的差別在于:fscanf遇到空格和換行時結束,注意空格時也結束,fgets遇到空格不結束。

  • 格式:int fscanf(FILE* stream,constchar* format,[argument]);

  • 返回值:成功返回讀入的參數的個數,失敗返回EOF。

  • 參數說明:

*stream:文件指針*format:格式字符串[argument]:輸入列表

注:用法與scanf函數類似

  • fread 函數說明:
#include<stdio.h> #include<string.h> int main(void) {FILE*stream;char msg[]="this is a test";char buf[20];if((stream=fopen("DUMMY.FIL","w+"))==NULL){fprintf(stderr,"Can not open output file.\n");return 0;}/*write some data to the file*/fwrite(msg,1,strlen(msg)+1,stream);/*sizeof(char)=1 seek to the beginning of the file*/fseek(stream,0,SEEK_SET);/*read the data and display it*/fread(buf,strlen(msg)+1,1,stream);printf("%s\n",buf);fclose(stream);return 0; }
  • 作用:從一個文件流中讀數據,最多讀取count個元素,每個元素size字節
  • 格式:size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
  • 返回值:如果調用成功返回實際讀取到的元素個數,如果不成功或讀到文件末尾返回0
  • 參數說明:
*buffer:用于接收數據的內存地址size:要讀的每個數據項的字節數,單位是字節count:要讀count個數據項,每個數據項size個字節*stream:文件指針

注:

這個函數以二進制形式對文件進行操作,不局限于文本文件
  • fwrite 函數說明:
#include <stdio.h> struct mystruct {int i;char cha; };int main(void) {FILE *stream;struct mystruct s;if ((stream = fopen("TEST.$$$", "wb")) == NULL) /* open file TEST.$$$ */{fprintf(stderr, "Cannot open output file.\n");return 1;}s.i = 0;s.cha = 'A';fwrite(&s, sizeof(s), 1, stream); /* 寫的struct文件*/fclose(stream); /*關閉文件*/return 0;
  • 作用:向文件寫入一個數據塊

  • 格式:size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);

  • 返回值:返回實際寫入的數據塊數目

  • 參數說明:

*buffer:是一個指針,對fwrite來說,是要獲取數據的地址;size:要寫入內容的單字節數count:要進行寫入size字節的數據項的個數*stream:文件指針

注:這個函數以二進制形式對文件進行操作,不局限于文本文件

二、隨機讀寫數據文件

  • rewind 函數說明:
#include <stdio.h> #include <dir.h> int main(void) {FILE *fp;char fname[10] = "TXXXXXX", *newname, first;//mktempC語言創建臨時文件newname = mktemp(fname);fp = fopen(newname,"w+");if(NULL==fp)return 1;fprintf(fp,"abcdefghijklmnopqrstuvwxyz");rewind(fp);fscanf(fp,"%c",&first);printf("The first character is: %c\n",first);fclose(fp);//remove()函數用來刪除指定的文件remove(newname);return 0; }
  • 作用:將文件內部的位置指針重新指向一個流(數據流/文件)的開頭
  • 格式:void rewind(FILE *stream);
  • 返回值:無
  • 參數說明:
*stream:文件指針
  • ftell 函數說明:
#include <stdio.h> int main(void) {FILE *stream;stream = fopen("MYFILE.TXT", "w+");fprintf(stream, "This is a test");printf("The file pointer is at byte \%ld\n", ftell(stream));fclose(stream);return 0; }
  • 作用:得到文件位置指針當前位置相對于文件首的偏移字節數(測定文件位置標記的當前位置)
  • 格式:long ftell(FILE *stream);
  • 返回值:成功返回當前文件位置,失敗返回-1L
  • 參數說明:
*stream:文件指針

注:因為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值
  • 參數說明:
*stream:文件指針offset:偏移量,正數表示正向偏移,負數表示負向偏移。因為是long型數據,所以應在數字后面加一個字母Lorigin:設定從文件的哪里開始偏移,可取值為:SEEK_CURSEEK_ENDSEEK_SET,詳見下:名字 起始點 用數字代表 SEEK_SET 文件開始位置 0 SEEK_CUR 文件當前位置 1 SEEK_END 文件末尾位置 2

示例:

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值表示出錯

  • 參數說明:

*stream:文件指針
  • clearerr 函數說明:

  • 作用:使文件錯誤標志和文件結束標志置為0。假設在調用一個輸入輸出函數時出現了錯誤,ferror函數值為一個非零值。在調用clearerr(fp)后,ferror(fp)的值變為0。只要出現錯誤標志,就一直保留,直到對同一文件調用clearerr函數或rewind函數,或任何其他一個輸入輸出函數。

  • 格式:void clearerr(FILE *stream);

  • 返回值:無

  • 參數說明:

*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(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。