廢話說在前面
在Linux
中,有兩種方式可操作文件,一種是C標準庫
的文件操作API來操作,另一種則是Linux
的系統調用API
。C標準庫
的文件相關API是帶f開頭的,如fopen
、fwrite
、fread
等;Linux
的系統調用相關API則是open
、write
、read
。
這次學習的是C標準庫的方式。
查看相關API如何使用
在Linux
中查看函數的使用方式都不用google、baidu,因爲Linux自帶man手冊
。
1、fopen函數
Linux shell終端
執行man fopen
即可查看API使用方法。
#include "stdio.h"
表明fopen
在這個頭文件中有聲明,使用這個函數就包括這個頭文件。
作用:打開文件
參數 | 解釋 |
---|---|
path | 文件名,不寫路徑就默認是當前路徑下 |
mode | 以什麼方式打開,讀?寫?取值是r、r+、w、w+等 |
打開方式的英文很簡單,一看就懂是幹嘛。
2、fwrite函數
作用:寫文件
參數 | 解釋 |
---|---|
ptr | 要寫入的內容 |
size | 數據項的大小 |
nmemb | 寫入的數據項 |
stream | 文件指針,文件的描述符,類似於ID |
size
和nmemb
可以理解爲,nmemb
是寫的次數,size
是每次要寫入多少
3、fread函數
man手冊
很人性化,知道write
和read
是經常一起操作所以都放一起,而且它們的參數相同。
作用:從文件中讀內容
參數 | 解釋 |
---|---|
ptr | 要寫入的內容 |
size | 數據項的大小 |
nmemb | 讀入的數據項 |
stream | 文件指針,文件的描述符,類似於ID |
size
和nmemb
可以理解爲,nmemb
是讀的次數,size
是每次要讀出多少
4、fclose函數
作用:關閉文件
參數 | 解釋 |
---|---|
stream | 文件指針 |
5、fflush函數
C庫函數有個啥緩衝區的東西,使用這個函數可以將要寫入的數據立即寫入文件中。
作用:將尚未寫入文件內容立即寫入。用於確保前面操作的數據被寫入到文件中。
參數 | 解釋 |
---|---|
stream | 文件指針 |
6、fseek函數
作用:用於設置下一次讀寫函數操作的位置
參數 | 解釋 |
---|---|
stream | 文件指針 |
offset | 指定的位置 |
whence | 該參數定義了offset 的意義,取值爲SEEK_SET 、SEEK_END 、SEEK_CUR |
當whence
是SEEK_SET
時,offset
是一個絕對位置,例如offset
爲0時就是設置讀寫位置到文件開頭。
當whence
是SEEK_END
時,offset
是一個相對位置,這個位置是相對文件尾來說的。
當whence
是SEEK_CUR
時,offset
是一個相對位置,這個位置是相對當前位置來說的。
使用相關函數讀寫文件
c_lib_file_io.c
:
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
const char buf[] = "I am the King of the world\r\n";
FILE *fp = NULL; //定義文件指針
char str[100]; //定義字符串
int len;
int main(int argc, char **argv)
{
if(argc != 2)
{
printf("Usage: %s + <read(or write)>\r\n",argv[0]); //打印用法
exit(1);
}
if(strcmp(argv[1],"write") == 0)
{
fp = fopen("c_lib_file_io.txt", "w+"); //可讀可寫方式打開文件,沒有該文件則創建
}
else if (strcmp(argv[1],"read") == 0)
{
fp = fopen("c_lib_file_io.txt", "r+"); // 可讀可寫方式打開文件,文件指指向文件開頭
}
if (NULL == fp)
{
printf("failed to open file\r\n");
return 0;
}
if(strcmp(argv[1],"write") == 0)
{
//每次寫入一字節,寫入總長度 = strlen(buf)
fwrite(buf, 1, strlen(buf), fp);
fwrite("AresXu\r\n", 1, strlen("AresXu\r\n"), fp);
fflush(fp);
printf("aaa-dyy\r\n");
}
else if(strcmp(argv[1],"read") == 0)
{
printf("bbb-dyy\r\n");
fseek(fp, 0, SEEK_SET); //這裏將文件指針重設到文件開頭,從頭開始讀
len = fread(str, 100, 1, fp);
printf("file content : %s\n nread len = %d\r\n", str, len);
}
else
{
printf("Usage: %s + <read(or write)>\r\n",argv[0]); //打印用法
fclose(fp); //關閉文件
exit(1);
}
fclose(fp); //關閉文件
return 0;
}
編譯程序:
gcc -o c_lib_file_io c_lib_file_io.c
寫入數據:
./c_lib_file_io write
讀出數據:
./c_lib_file_io read
讀寫結果: