RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語(yǔ)言-文件編程

DS小龍哥-嵌入式技術(shù) ? 來(lái)源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2022-09-09 11:33 ? 次閱讀

【摘要】 這篇文章介紹C語(yǔ)言的文件編程函數(shù),案例代碼是在Linux環(huán)境下運(yùn)行測(cè)試的分別介紹了C語(yǔ)言標(biāo)準(zhǔn)庫(kù)的文件編程接口和Linux下的文件編程函數(shù)。

1. 文件編程函數(shù)介紹

如果在Linux系統(tǒng)下學(xué)習(xí)C語(yǔ)言,就會(huì)了解到兩套文件編程接口函數(shù):

C語(yǔ)言標(biāo)準(zhǔn)的文件編程函數(shù): fopen、fread、fwrite、fclose

Linux下提供的文件編程函數(shù): open、read、write、close

傳參的區(qū)別:

基于文件指針: fopen fclose fread fwrite 比較適合操作普通文件。

基于文件描述符: open close read write 比較適合操作設(shè)備文件。

2. C語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供的文件編程函數(shù)

下面介紹C語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供的文件編程函數(shù),一般對(duì)文件常用的操作就是:創(chuàng)建(打開(kāi))、讀、寫(xiě)、關(guān)閉。

其他的函數(shù)用法同理,只要把這4個(gè)函數(shù)學(xué)會(huì)了,基本的文件操作已經(jīng)可以完成了。

#include 
FILE *fopen(const char *path, const char *mode);
函數(shù)功能: 打開(kāi)或者創(chuàng)建文件
函數(shù)參數(shù):
const char *path  填文件的路徑
const char *mode  填權(quán)限。比如: wb rb a+b 
函數(shù)返回值: 文件打開(kāi)或者創(chuàng)建成功返回對(duì)應(yīng)的文件指針.

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
函數(shù)功能: 讀文件
函數(shù)參數(shù):
void *ptr :讀取數(shù)據(jù)存放的緩沖區(qū)。
size_t size :每次讀取的大小
size_t nmemb :每次讀取的次數(shù)
FILE *stream :讀取文件
返回值: 讀取成功的次數(shù)。
比如: fread(buff,1,1000,fp);   從fp文件里讀取1000個(gè)字節(jié)的數(shù)據(jù)到buff里。

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
函數(shù)功能: 寫(xiě)文件
函數(shù)參數(shù):
void *ptr :將要寫(xiě)入的數(shù)據(jù)緩沖區(qū)首地址。
size_t size :每次寫(xiě)入的大小
size_t nmemb :每次寫(xiě)入的次數(shù)
FILE *stream :寫(xiě)入的文件
返回值: 寫(xiě)入成功的次數(shù)。
比如: fwrite(buff,1,1000,fp);   向fp文件里寫(xiě)1000個(gè)字節(jié)的數(shù)據(jù),數(shù)據(jù)從buff里獲取。

int fclose(FILE *fp);
函數(shù)功能: 關(guān)閉打開(kāi)的文件。

3. Linux下的系統(tǒng)函數(shù): 文件編程函數(shù)

Linux下也有一套系統(tǒng)函數(shù),用于文件操作,這些函數(shù)在Linux下常用于讀寫(xiě)設(shè)備文件;當(dāng)然,讀寫(xiě)普通文件也是一樣,普通文件也是磁盤(pán)上的數(shù)據(jù),也是操作塊設(shè)備驅(qū)動(dòng)。

#include 
#include 
#include 

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
函數(shù)功能: 打開(kāi)或者創(chuàng)建文件
函數(shù)參數(shù):
const char *pathname  : 文件的路徑
int flags :打開(kāi)文件的權(quán)限. 
   比如: O_RDONLY  O_WRONLY  O_RDWR  O_CREAT
mode_t mode :創(chuàng)建文件時(shí)指定文件本身的權(quán)限.
   比如:
    S_IRWXU  00700 user (file owner) has read, write and execute permission
    S_IRUSR  00400 user has read permission
    S_IWUSR  00200 user has write permission
    S_IXUSR  00100 user has execute permission

    S_IRWXG  00070 group has read, write and execute permission
    S_IRGRP  00040 group has read permission
    S_IWGRP  00020 group has write permission
    S_IXGRP  00010 group has execute permission

    S_IRWXO  00007 others have read, write and execute permission
    S_IROTH  00004 others have read permission
    S_IWOTH  00002 others have write permission
    S_IXOTH  00001 others have execute permission
返回值: (返回文件描述符--小整數(shù))文件打開(kāi)成功值>=0 否則<0
示例: open("123.c",O_RDWR|O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO);
創(chuàng)建一個(gè)123.c的新文件,并且指定該文件的權(quán)限是最高權(quán)限. chmod 777 123.c一樣

ssize_t read(int fd, void *buf, size_t count);
函數(shù)功能: 讀文件
函數(shù)參數(shù):
int fd  :文件描述符. ---表示已經(jīng)打開(kāi)的文件。
void *buf :讀取數(shù)據(jù)存放的緩沖區(qū).
size_t count :讀取字節(jié)數(shù)量.
返回值: 成功讀取的字節(jié)數(shù)量.

ssize_t write(int fd, const void *buf, size_t count);
函數(shù)功能: 寫(xiě)文件
函數(shù)參數(shù):
int fd  :文件描述符. ---表示已經(jīng)打開(kāi)的文件。
void *buf :將要寫(xiě)入到文件的數(shù)緩沖區(qū)首地址.
size_t count :寫(xiě)入的字節(jié)數(shù)量.
返回值: 成功寫(xiě)入的字節(jié)數(shù)量.

int close(int fd);
函數(shù)功能: 關(guān)閉已經(jīng)打開(kāi)的文件.

4. 案例: 實(shí)現(xiàn)文件拷貝功能(fopen)

例如: cp 123.c 456.c 將123.c的數(shù)據(jù)拷貝到456.c文件里。

注意: 下面這個(gè)代碼需要在命令行上運(yùn)行,需要給main函數(shù)傳參。如果是在windows下IED軟件里運(yùn)行,可以將傳參代碼屏蔽掉,改成讓用戶輸入,或者直接把參數(shù)固定也可以。

#include 
//實(shí)現(xiàn): cp 123.c 456.c
int main(int argc,char **argv)
{
    if(argc!=3)
    {
        printf("參數(shù): ./a.out <源文件> <目標(biāo)文件>\n");
        return 0;
    }
    /*1. 打開(kāi)源文件*/
    FILE *src_fp=fopen(argv[1],"rb");
    if(src_fp==NULL)
    {
        printf("%s 文件打開(kāi)失敗.\n",argv[1]);
        return -1;
    }
    /*2. 創(chuàng)建新文件*/
    FILE *new_fp=fopen(argv[2],"wb");
    if(new_fp==NULL)
    {
        printf("%s 文件創(chuàng)建失敗.\n",argv[2]);
        fclose(src_fp);
        return -2;
    }
    /*3. 實(shí)現(xiàn)文件的拷貝*/
    unsigned char buff[1024];
    unsigned int cnt;
    while(1)
    {
        cnt=fread(buff,1,1024,src_fp);
        fwrite(buff,1,cnt,new_fp);
        if(cnt!=1024)break;
    }
    /*4. 關(guān)閉文件*/
    fclose(new_fp);
    fclose(src_fp);
    return 0;
}

5. 案例: 實(shí)現(xiàn)文件拷貝功能(open)

例如: cp 123.c 456.c 將123.c的數(shù)據(jù)拷貝到456.c文件里。

#include 
#include 
#include 
#include 

//實(shí)現(xiàn): cp 123.c 456.c
int main(int argc,char **argv)
{
    if(argc!=3)
    {
        printf("參數(shù): ./a.out <源文件> <目標(biāo)文件>\n");
        return 0;
    }
    /*1. 打開(kāi)源文件*/
    int fd_src=open(argv[1],O_RDONLY);
    if(fd_src<0)
    {
        printf("源文件打開(kāi)失敗.\n");
        return -1;
    }
    /*2. 創(chuàng)建新文件*/
    int fd_new=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
    if(fd_new<0)
    {
        printf("新文件創(chuàng)建失敗.\n");
        close(fd_src);
        return -2;
    }
    /*3. 拷貝文件*/
    unsigned char buff[1024];
    int cnt;
    while(1)
    {
        cnt=read(fd_src,buff,1024);
        write(fd_new,buff,cnt);
        if(cnt!=1024)break;
    }
    /*4. 關(guān)閉文件*/
    close(fd_src);
    close(fd_new);
    return 0;
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11292

    瀏覽量

    209325
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136685
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3614

    瀏覽量

    93686
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    linux下c語(yǔ)言編程pdf

    linux下c語(yǔ)言編程內(nèi)容為::基礎(chǔ)知識(shí),進(jìn)程介紹,文件操作,時(shí)間概念,信號(hào)處理,消息管理,線程操作,網(wǎng)絡(luò)編程,Linux 下
    發(fā)表于 12-08 10:00 ?0次下載

    利用C語(yǔ)言和GEL語(yǔ)言的Flash編程新方法

    利用C語(yǔ)言和GEL語(yǔ)言的Flash編程新方法 以TMS320VC5402為例,探討一種綜合運(yùn)用C語(yǔ)言
    發(fā)表于 03-29 15:13 ?1596次閱讀
    利用<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>和GEL<b class='flag-5'>語(yǔ)言</b>的Flash<b class='flag-5'>編程</b>新方法

    C語(yǔ)言編程技巧

    電子發(fā)燒友為您提供了 C語(yǔ)言 編程技巧,幫助您解決編程的困擾。
    發(fā)表于 06-23 14:53 ?603次下載

    STM8的C語(yǔ)言編程說(shuō)明

    STM8的C語(yǔ)言編程說(shuō)明STM8的C語(yǔ)言編程說(shuō)明STM8的C
    發(fā)表于 12-10 16:19 ?37次下載

    C語(yǔ)言入門(mén)經(jīng)典-C語(yǔ)言編程

    C語(yǔ)言入門(mén)經(jīng)典-C語(yǔ)言編程,感興趣的可以看看哦。
    發(fā)表于 08-16 18:54 ?126次下載

    C語(yǔ)言文件編程操作

    Linux 常見(jiàn)的文件類(lèi)型:普通文件、目錄文件、設(shè)備文件、管道文件、套接字和鏈接文件等等。它們的
    發(fā)表于 11-16 10:19 ?1845次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>文件</b><b class='flag-5'>編程</b>操作

    C語(yǔ)言程序例程的文件結(jié)構(gòu)

    以往寫(xiě)C語(yǔ)言程序都是一個(gè)文件里面寫(xiě)個(gè)幾十、幾百行,在練算法的時(shí)候還可以,現(xiàn)在搞開(kāi)發(fā)需要模塊化編程,所謂模塊化編程,就是指一個(gè)程序包含多個(gè)源
    的頭像 發(fā)表于 03-14 10:32 ?6254次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>程序例程的<b class='flag-5'>文件</b>結(jié)構(gòu)

    C語(yǔ)言編程文件操作函數(shù)庫(kù)匯總資源下載

    C語(yǔ)言編程文件操作函數(shù)庫(kù)匯總資源下載
    發(fā)表于 04-15 16:42 ?13次下載
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>編程</b><b class='flag-5'>文件</b>操作函數(shù)庫(kù)匯總資源下載

    C語(yǔ)言編程常用的文件處理函數(shù)匯總下載

    C語(yǔ)言編程常用的文件處理函數(shù)匯總下載
    發(fā)表于 04-15 16:44 ?9次下載
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>編程</b>常用的<b class='flag-5'>文件</b>處理函數(shù)匯總下載

    單片機(jī)c語(yǔ)言+編程c語(yǔ)言_CC ++編程語(yǔ)言有什么區(qū)別?

    單片機(jī)c語(yǔ)言+編程c語(yǔ)言C & C++ ar
    發(fā)表于 11-23 17:51 ?20次下載
    單片機(jī)<b class='flag-5'>c</b><b class='flag-5'>語(yǔ)言</b>+<b class='flag-5'>編程</b><b class='flag-5'>c</b><b class='flag-5'>語(yǔ)言</b>_<b class='flag-5'>C</b>和<b class='flag-5'>C</b> ++<b class='flag-5'>編程</b><b class='flag-5'>語(yǔ)言</b>有什么區(qū)別?

    單片機(jī)c語(yǔ)言+編程c語(yǔ)言_C編程語(yǔ)言簡(jiǎn)介

    單片機(jī)c語(yǔ)言+編程c語(yǔ)言In this tutorial you will get basic introduction to
    發(fā)表于 11-29 10:21 ?38次下載
    單片機(jī)<b class='flag-5'>c</b><b class='flag-5'>語(yǔ)言</b>+<b class='flag-5'>編程</b><b class='flag-5'>c</b><b class='flag-5'>語(yǔ)言</b>_<b class='flag-5'>C</b><b class='flag-5'>編程</b><b class='flag-5'>語(yǔ)言</b>簡(jiǎn)介

    Linux開(kāi)發(fā)_ Linux命令復(fù)習(xí)與文件目錄復(fù)習(xí)

    介紹Linux下基本指令、系統(tǒng)環(huán)境搭建、復(fù)習(xí)C語(yǔ)言文件編程。
    的頭像 發(fā)表于 09-17 15:44 ?941次閱讀
    Linux開(kāi)發(fā)_ Linux命令復(fù)習(xí)與<b class='flag-5'>文件</b>目錄復(fù)習(xí)

    Linux開(kāi)發(fā)_文件目錄操作介紹、創(chuàng)建BMP圖片

    介紹C語(yǔ)言文件編程,創(chuàng)建BMP圖片,BMP圖片結(jié)構(gòu)介紹,介紹目錄接口編程,Makefile知識(shí)點(diǎn)。
    的頭像 發(fā)表于 09-17 15:44 ?1481次閱讀
    Linux開(kāi)發(fā)_<b class='flag-5'>文件</b>目錄操作介紹、創(chuàng)建BMP圖片

    PLC編程語(yǔ)言C語(yǔ)言的區(qū)別

    在工業(yè)自動(dòng)化和計(jì)算機(jī)編程領(lǐng)域中,PLC(可編程邏輯控制器)編程語(yǔ)言C語(yǔ)言各自扮演著重要的角色。
    的頭像 發(fā)表于 06-14 17:11 ?2776次閱讀

    hex文件如何查看原c語(yǔ)言代碼

    是處理器可以直接執(zhí)行的指令,而 C 語(yǔ)言代碼則是人類(lèi)可讀的高級(jí)編程語(yǔ)言代碼。 然而,如果你想要從 .hex 文件中獲取一些有用的信息或者對(duì)程
    的頭像 發(fā)表于 09-02 10:37 ?2127次閱讀
    RM新时代网站-首页