閱讀優秀原始碼時可能會用的C函式(記錄)

Swift_Xu發表於2017-12-21

開啟檔案

使用 fopen( ) 函式來建立一個新的檔案或者開啟一個已有的檔案,這個呼叫會初始化型別 FILE 的一個物件,型別 FILE 包含了所有用來控制流的必要的資訊。下面是這個函式呼叫的原型

FILE *fopen( const char * filename, const char * mode );
複製程式碼

filename 是字串,用來命名檔案, mode 的值可以是下列值中的一個:

閱讀優秀原始碼時可能會用的C函式(記錄)

如果處理的是二進位制檔案,則需使用下面的訪問模式來取代上面的訪問模式:

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"
複製程式碼

關閉檔案

為了關閉檔案,請使用 fclose( ) 函式。函式的原型如下:

int fputc( int c, FILE *fp );
複製程式碼

如果成功關閉檔案,fclose( ) 函式返回零,如果關閉檔案時發生錯誤,函式返回 EOF。這個函式實際上,會清空緩衝區中的資料,關閉檔案,並釋放用於該檔案的所有記憶體。EOF 是一個定義在標頭檔案 stdio.h 中的常量。 C 標準庫提供了各種函式來按字元或者以固定長度字串的形式讀寫檔案。

寫入檔案

int fputc( int c, FILE *fp );
複製程式碼

函式 fputc() 把引數 c 的字元值寫入到 fp 所指向的輸出流中。如果寫入成功,它會返回寫入的字元,如果發生錯誤,則會返回 EOF。您可以使用下面的函式來把一個以 null 結尾的字串寫入到流中:

int fputs( const char *s, FILE *fp );
複製程式碼

函式 fputs() 把字串 s 寫入到 fp 所指向的輸出流中。如果寫入成功,它會返回一個非負值,如果發生錯誤,則會返回 EOF。您也可以使用 int fprintf(FILE *fp,const char *format, ...) 函式來寫把一個字串寫入到檔案中

注意:請確保您有可用的 /tmp 目錄,如果不存在該目錄,則需要在您的計算機上先建立該目錄。

#include <stdio.h>
 
int main()
{
   FILE *fp = NULL;
 
   fp = fopen("/tmp/test.txt", "w+");
   fprintf(fp, "This is testing for fprintf...\n");
   fputs("This is testing for fputs...\n", fp);
   fclose(fp);
}
複製程式碼

當上面的程式碼被編譯和執行時,它會在 /tmp 目錄中建立一個新的檔案 test.txt,並使用兩個不同的函式寫入兩行

讀取檔案

int fgetc( FILE * fp );
複製程式碼

fgetc() 函式從 fp 所指向的輸入檔案中讀取一個字元。返回值是讀取的字元,如果發生錯誤則返回 EOF。下面的函式允許您從流中讀取一個字串:

char *fgets( char *buf, int n, FILE *fp );
複製程式碼

函式 fgets() 從 fp 所指向的輸入流中讀取 n - 1 個字元。它會把讀取的字串複製到緩衝區 buf,並在最後追加一個 null 字元來終止字串。 如果這個函式在讀取最後一個字元之前就遇到一個換行符 '\n' 或檔案的末尾 EOF,則只會返回讀取到的字元,包括換行符。您也可以使用 int fscanf(FILE *fp, const char *format, ...) 函式來從檔案中讀取字串,但是在遇到第一個空格字元時,它會停止讀取。

#include <stdio.h>
 
int main()
{
   FILE *fp = NULL;
   char buff[255];
 
   fp = fopen("/tmp/test.txt", "r");
   fscanf(fp, "%s", buff);
   printf("1 : %s\n", buff );
 
   fgets(buff, 255, (FILE*)fp);
   printf("2: %s\n", buff );
   
   fgets(buff, 255, (FILE*)fp);
   printf("3: %s\n", buff );
   fclose(fp);
 
}
複製程式碼

當上面的程式碼被編譯和執行時,它會讀取上一部分建立的檔案,產生下列結果:

1 : This
2: is testing for fprintf...

3: This is testing for fputs...
複製程式碼

首先,fscanf() 方法只讀取了 This,因為它在後邊遇到了一個空格。其次,呼叫 fgets() 讀取剩餘的部分,直到行尾。最後,呼叫 fgets() 完整地讀取第二行。

二進位制 I/O 函式 下面兩個函式用於二進位制輸入和輸出:

ize_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
  
size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
複製程式碼

這兩個函式都是用於儲存塊的讀寫 - 通常是陣列或結構體。

fseek 可以移動檔案指標到指定位置讀,或插入寫:

int fseek(FILE *stream, long offset, int whence);
複製程式碼

fseek 設定當前讀寫點到 offset 處, whence 可以是 SEEK_SET,SEEK_CUR,SEEK_END 這些值決定是從檔案頭、當前點和檔案尾計算偏移量 offset。 你可以定義一個檔案指標 FILE *fp,當你開啟一個檔案時,檔案指標指向開頭,你要指到多少個位元組,只要控制偏移量就好,例如, 相對當前位置往後移動一個位元組:fseek(fp,1,SEEK_CUR); 中間的值就是偏移量。 如果你要往前移動一個位元組,直接改為負值就可以:fseek(fp,-1,SEEK_CUR)。 執行以下例項前,確保當前目錄下 test.txt 檔案已建立:

#include <stdio.h>

int main(){   
    FILE *fp = NULL;
    fp = fopen("test.txt", "r+");  // 確保 test.txt 檔案已建立
    fprintf(fp, "This is testing for fprintf...\n");   
    fseek(fp, 10, SEEK_SET);
    if (fputc(65,fp) == EOF) {
        printf("fputc fail");   
    }   
    fclose(fp);
}
複製程式碼

執行結束後,開啟 test.txt 檔案:

This is teAting for fprintf...
複製程式碼

注意: 只有用 r+ 模式開啟檔案才能插入內容,w 或 w+ 模式都會清空掉原來檔案的內容再來寫,a 或 a+ 模式即總會在檔案最尾新增內容,哪怕用 fseek() 移動了檔案指標位置。

字串常用的函式

閱讀優秀原始碼時可能會用的C函式(記錄)

#include <stdio.h>
#include <string.h>

int main ()
{
   char str1[12] = "Hello";
   char str2[12] = "World";
   char str3[12];
   int  len ;

   /* 複製 str1 到 str3 */
   strcpy(str3, str1);
   printf("strcpy( str3, str1) :  %s\n", str3 );

   /* 連線 str1 和 str2 */
   strcat( str1, str2);
   printf("strcat( str1, str2):   %s\n", str1 );

   /* 連線後,str1 的總長度 */
   len = strlen(str1);
   printf("strlen(str1) :  %d\n", len );

   return 0;
}
複製程式碼

執行結果

strcpy( str3, str1) :  Hello
strcat( str1, str2):   HelloWorld
strlen(str1) :  10


複製程式碼

c 標準庫 <ctype.h>

閱讀優秀原始碼時可能會用的C函式(記錄)

閱讀優秀原始碼時可能會用的C函式(記錄)

c 標準庫 <math.h>

閱讀優秀原始碼時可能會用的C函式(記錄)

閱讀優秀原始碼時可能會用的C函式(記錄)

相關文章