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

读写结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欲盖弥彰1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值