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

简介: 本文介绍了在Linux环境下使用C语言进行文件编程时的两种主要接口:C标准库函数与Linux系统调用。C标准库提供了`fopen`, `fread`, `fwrite`, 和 `fclose`等函数,适用于普通文件操作;而Linux系统调用如`open`, `read`, `write`, 和 `close`则更适合处理设备文件,同时也可用于普通文件。这两种方法的主要区别在于前者使用文件指针,后者使用文件描述符。文章还给出了两个示例程序:一个使用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_CREAT
mode_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.c
int 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.c
int 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;
}
相关文章
|
2月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
1月前
|
机器学习/深度学习 人工智能 Ubuntu
|
18天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
1月前
|
存储 数据可视化 Java
震惊!如何在linux下部署项目,部署/运行jar包 超详细保姆级教程!
如何在Linux系统下部署和运行Java项目jar包,包括传输文件到Linux、使用nohup命令运行jar包、查看端口状态、杀死进程和查看项目运行状态,以及如何解决“没有主清单属性”的错误。
414 1
震惊!如何在linux下部署项目,部署/运行jar包 超详细保姆级教程!
|
25天前
|
存储 编译器 C语言
如何在 C 语言中判断文件缓冲区是否需要刷新?
在C语言中,可以通过检查文件流的内部状态或使用`fflush`函数尝试刷新缓冲区来判断文件缓冲区是否需要刷新。通常,当缓冲区满、遇到换行符或显式调用`fflush`时,缓冲区会自动刷新。
|
25天前
|
存储 编译器 C语言
C语言:文件缓冲区刷新方式有几种
C语言中文件缓冲区的刷新方式主要包括三种:自动刷新(如遇到换行符或缓冲区满)、显式调用 fflush() 函数强制刷新、以及关闭文件时自动刷新。这些方法确保数据及时写入文件。
|
1月前
|
NoSQL C语言 索引
十二个C语言新手编程时常犯的错误及解决方式
C语言初学者常遇错误包括语法错误、未初始化变量、数组越界、指针错误、函数声明与定义不匹配、忘记包含头文件、格式化字符串错误、忘记返回值、内存泄漏、逻辑错误、字符串未正确终止及递归无退出条件。解决方法涉及仔细检查代码、初始化变量、确保索引有效、正确使用指针与格式化字符串、包含必要头文件、使用调试工具跟踪逻辑、避免内存泄漏及确保递归有基准情况。利用调试器、编写注释及查阅资料也有助于提高编程效率。避免这些错误可使代码更稳定、高效。
216 12
|
1月前
|
C语言
【C语言】探索文件读写函数的全貌(三)
【C语言】探索文件读写函数的全貌
|
1月前
|
存储 C语言
【C语言】探索文件读写函数的全貌(二)
【C语言】探索文件读写函数的全貌
|
2月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余