写点什么

C 语言文件编程 -Linux 环境下运行

作者:芯动大师
  • 2024-07-28
    四川
  • 本文字数:2579 字

    阅读完需:约 8 分钟

C语言文件编程-Linux环境下运行

1. 文件编程函数介绍

如果在 Linux 系统下学习 C 语言,就会了解到两套文件编程接口函数:

C 语言标准的文件编程函数: fopenfreadfwritefclose

Linux 下提供的文件编程函数: openreadwriteclose

传参的区别:

基于文件指针: fopen fclose fread fwrite 比较适合操作普通文件。

基于文件描述符: open close read write 比较适合操作设备文件。

2. C 语言标准库提供的文件编程函数

下面介绍 C 语言标准库提供的文件编程函数,一般对文件常用的操作就是:创建(打开)、读、写、关闭。

其他的函数用法同理,只要把这 4 个函数学会了,基本的文件操作已经可以完成了。

#include FILE *fopen(const char *path, const char *mode);函数功能: 打开或者创建文件函数参数:const char *path  填文件的路径const char *mode  填权限。比如: wb rb a+b 函数返回值: 文件打开或者创建成功返回对应的文件指针.
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);函数功能: 读文件函数参数:void *ptr :读取数据存放的缓冲区。size_t size :每次读取的大小size_t nmemb :每次读取的次数FILE *stream :读取文件返回值: 读取成功的次数。比如: fread(buff,1,1000,fp); 从fp文件里读取1000个字节的数据到buff里。
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);函数功能: 写文件函数参数:void *ptr :将要写入的数据缓冲区首地址。size_t size :每次写入的大小size_t nmemb :每次写入的次数FILE *stream :写入的文件返回值: 写入成功的次数。比如: fwrite(buff,1,1000,fp); 向fp文件里写1000个字节的数据,数据从buff里获取。
int fclose(FILE *fp);函数功能: 关闭打开的文件。
复制代码

3. Linux 下的系统函数: 文件编程函数

Linux 下也有一套系统函数,用于文件操作,这些函数在 Linux 下常用于读写设备文件;当然,读写普通文件也是一样,普通文件也是磁盘上的数据,也是操作块设备驱动。

#include #include #include 
int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);函数功能: 打开或者创建文件函数参数:const char *pathname : 文件的路径int flags :打开文件的权限. 比如: O_RDONLY O_WRONLY O_RDWR O_CREATmode_t mode :创建文件时指定文件本身的权限. 比如: 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返回值: (返回文件描述符--小整数)文件打开成功值>=0 否则<0示例: open("123.c",O_RDWR|O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO);创建一个123.c的新文件,并且指定该文件的权限是最高权限. chmod 777 123.c一样
ssize_t read(int fd, void *buf, size_t count);函数功能: 读文件函数参数:int fd :文件描述符. ---表示已经打开的文件。void *buf :读取数据存放的缓冲区.size_t count :读取字节数量.返回值: 成功读取的字节数量.
ssize_t write(int fd, const void *buf, size_t count);函数功能: 写文件函数参数:int fd :文件描述符. ---表示已经打开的文件。void *buf :将要写入到文件的数缓冲区首地址.size_t count :写入的字节数量.返回值: 成功写入的字节数量.
int close(int fd);函数功能: 关闭已经打开的文件.
复制代码

4. 案例: 实现文件拷贝功能(fopen)

例如: cp 123.c 456.c 将 123.c 的数据拷贝到 456.c 文件里。

注意: 下面这个代码需要在命令行上运行,需要给 main 函数传参。如果是在 windows 下 IED 软件里运行,可以将传参代码屏蔽掉,改成让用户输入,或者直接把参数固定也可以。

#include //实现: cp 123.c 456.cint main(int argc,char **argv){    if(argc!=3)    {        printf("参数: ./a.out <源文件> <目标文件>\n");        return 0;    }    /*1. 打开源文件*/    FILE *src_fp=fopen(argv[1],"rb");    if(src_fp==NULL)    {        printf("%s 文件打开失败.\n",argv[1]);        return -1;    }    /*2. 创建新文件*/    FILE *new_fp=fopen(argv[2],"wb");    if(new_fp==NULL)    {        printf("%s 文件创建失败.\n",argv[2]);        fclose(src_fp);        return -2;    }    /*3. 实现文件的拷贝*/    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. 关闭文件*/    fclose(new_fp);    fclose(src_fp);    return 0;}
复制代码

5. 案例: 实现文件拷贝功能(open)

例如: cp 123.c 456.c 将 123.c 的数据拷贝到 456.c 文件里。

#include #include #include #include 
//实现: cp 123.c 456.cint main(int argc,char **argv){ if(argc!=3) { printf("参数: ./a.out <源文件> <目标文件>\n"); return 0; } /*1. 打开源文件*/ int fd_src=open(argv[1],O_RDONLY); if(fd_src<0) { printf("源文件打开失败.\n"); return -1; } /*2. 创建新文件*/ int fd_new=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); if(fd_new<0) { printf("新文件创建失败.\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. 关闭文件*/ close(fd_src); close(fd_new); return 0;}
复制代码


发布于: 18 分钟前阅读数: 6
用户头像

芯动大师

关注

凡事预则立,不预则废! 2022-06-01 加入

某公司芯片AE工程师,嵌入式开发工程师,InfoQ签约作者,阿里云专家博主,华为云·云享专家,51CTO专家博主,腾讯云社区优秀共创官。

评论

发布
暂无评论
C语言文件编程-Linux环境下运行_Linux_芯动大师_InfoQ写作社区