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

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

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