目錄
一、標準C庫打開/創建文件,讀寫文件,光標移動
二、標準C庫寫入結構體到文件
三、其他函數補充
1.fputc函數
2.feof函數和fgetc函數
前面講到的open函數都是基于linux內核的,也就是說在Windows系統上無法運行,移植性比較差,但標準C庫同樣有一套對文件進行操作的函數。
一、標準C庫打開/創建文件,讀寫文件,光標移動
打開文件函數:
#include <stdio.h>FILE *fopen(const char *path, const char *mode);
返回值為FILE類型的文件流,第一個參數是文件的路徑,第二個參數是用什么權限打開文件,權限如下:?
寫入文件函數:
#include <stdio.h>size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
第一個參數是緩存區,第二個參數表示我們要寫入的每個數據的大小(例如要寫入一個字符串,那么size=sizeof(char),表示一個字符的大小),第三個參數是個數,第四個選擇哪個文件,傳入fopen函數的返回值即可。
讀取文件函數:
#include <stdio.h>size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
參數含義和寫入文件的函數類似?
光標移動函數:
#include <stdio.h>int fseek(FILE *stream, long offset, int whence);
代碼示例:?
#include <stdio.h>
#include <string.h>int main()
{FILE *fp;//存儲fopen的返回值char *str = "Hello World!";char readBuf[128]={0};//存放讀取到的數據fp = fopen("./li.txt","w+");//因為第二個參數要傳入指針,所以用雙引號fwrite(str,sizeof(char),strlen(str),fp);fseek(fp,0,SEEK_SET);//光標復位fread(readBuf,sizeof(char),strlen(str),fp);printf("read data:%s\n",readBuf);return 0;
}
可以看到標準C庫的文件相關函數和Linux的函數是差不多的,標準C庫對不同文件的操作是獲取它的FILE類型的指針,而Linux是int類型的文件描述符,這些函數都可以類比Linux的函數來記憶。
運行結果:?
二、標準C庫寫入結構體到文件
代碼示例:
#include <stdio.h>
#include <string.h>struct Test{int a;char c;
};int main()
{FILE *fp;struct Test data={100,'a'};struct Test data2;fp = fopen("./file1","w+");int n_write = fwrite(&data,sizeof(struct Test),1,fp); fseek(fp,0,SEEK_SET);int n_read = fread(&data2,sizeof(struct Test),1,fp);printf("read %d,%c\n",data2.a,data2.c);fclose(fp);return 0;
}
這里的代碼都可以類比我的上一篇文章Linux文件編程應用,只不過函數的參數和返回值不太相同,能看懂上一篇文章,那么這一篇就只是對C語言的鞏固,這里解釋一下fwrite函數和fread函數第二個和第三個參數的含義:拿上面代碼舉例,每次寫都寫入一個結構體類型的數據大小,用sizeof計算,第三個參數表示寫了幾次,這里寫一次就行了。
運行結果:
三、其他函數補充
1.fputc函數
#include <stdio.h>int fputc(int c, FILE *stream);
fputc函數可以寫入一個字符或整數到文件里,用fopen函數得到文件的返回值傳入fputc的第二個參數即可,要寫入多個數據用循環的方式寫入即可。?
代碼示例:
#include <stdio.h>
#include <string.h>int main()
{FILE *fp;char *str="Hello World!";int i;int len=strlen(str);fp=fopen("./file1","w+");for(i=0;i<len;i++){fputc(*str,fp);str++;}fclose(fp);return 0;
}
2.feof函數和fgetc函數
feof函數:
#include <stdio.h>int feof(FILE *stream);
fgetc函數:
#include <stdio.h>int fgetc(FILE *stream);
這兩個函數可以組合在一起用,見代碼示例:
#include <stdio.h>
#include <string.h>int main()
{FILE *fp; char c;fp = fopen("./li.txt","r");while(!feof(fp))// nonezero if reach end of file{c = fgetc(fp);printf("%c",c);}fclose(fp);return 0;
}
我們先用只讀的方式打開li.txt文件,feof可以作為條件判斷,當讀到文件的尾部時,feof函數的返回值為0,在while循環里使用fgetc函數一個一個字符讀取fp所指向的文件。(至于為什么不會一直讀文件的同一個位置,應該就和這兩個函數有關)
以上就是Linux引入標準C庫對文件操作的函數,看了前面兩個文章,再看這篇會很好理解,用標準C庫來寫代碼無非就是移植性比較好,以后在Linux學習過程中,很多時候還是要用到Linux的函數。接下來我會更新Linux進程編程的學習筆記,希望大伙一起討論學習!