Linux文件操作學習之C標準庫

廢話說在前面

Linux中,有兩種方式可操作文件,一種是C標準庫的文件操作API來操作,另一種則是Linux系統調用APIC標準庫的文件相關API是帶f開頭的,如fopenfwritefread等;Linux的系統調用相關API則是openwriteread
這次學習的是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

sizenmemb可以理解爲,nmemb是寫的次數,size是每次要寫入多少

3、fread函數

man手冊很人性化,知道writeread是經常一起操作所以都放一起,而且它們的參數相同。
在這裏插入圖片描述

作用:從文件中讀內容
參數 解釋
ptr 要寫入的內容
size 數據項的大小
nmemb 讀入的數據項
stream 文件指針,文件的描述符,類似於ID

sizenmemb可以理解爲,nmemb是讀的次數,size是每次要讀出多少

4、fclose函數

在這裏插入圖片描述

作用:關閉文件
參數 解釋
stream 文件指針

5、fflush函數

C庫函數有個啥緩衝區的東西,使用這個函數可以將要寫入的數據立即寫入文件中。
在這裏插入圖片描述

作用:將尚未寫入文件內容立即寫入。用於確保前面操作的數據被寫入到文件中。
參數 解釋
stream 文件指針

6、fseek函數

在這裏插入圖片描述

作用:用於設置下一次讀寫函數操作的位置
參數 解釋
stream 文件指針
offset 指定的位置
whence 該參數定義了offset的意義,取值爲SEEK_SETSEEK_ENDSEEK_CUR

whenceSEEK_SET時,offset是一個絕對位置,例如offset爲0時就是設置讀寫位置到文件開頭。
whenceSEEK_END時,offset是一個相對位置,這個位置是相對文件尾來說的。
whenceSEEK_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

讀寫結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章