linux文件操作

文章目录

1、fopen()

用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数

函数声明:

#include <stdio.h>
FILE *fopen(const char *__restrict__ __filename, const char *__restrict__ __modes)
  • restrict __filename : 字符串,表示要打开的文件名称。
  • restrict __modes :字符串,表示文件的访问模式,具体如下所示:

“r” 打开一个用于读取的文件。该文件必须存在。
“w” 创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。
“a” 追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。
“r+” 打开一个用于更新的文件,可读取也可写入。该文件必须存在。
“w+” 创建一个用于读写的空文件。
“a+” 打开一个用于读取和追加的文件。

函数返回值:

该函数返回一个 FILE 指针。否则返回 NULL,且设置全局变量 errno 来标识错误。

实例1:

uint8_t text_file() {
    /*
    "w"	创建一个用于写入的空文件。如果文件名称与已存在的文件相同,
    则会删除已有文件的内容,文件被视为一个新的空文件。
    */

    FILE* fp;

    fp = fopen("file.txt", "w+");
    if (!fp) {
        puts("Fail to open file!");
    }
    fprintf(fp, "%s %s %s %d", "We", "are", "in", 2022);

    fclose(fp);

    return 0;
}

结果:

在这里插入图片描述

实例2:

uint8_t text_file_add() {
    /*
     a+ :打开一个用于读取和追加的文件。
    */

    FILE* fp;

    fp = fopen("file.txt", "a+");
    if (!fp) {
        puts("Fail to open file!");
    }
    fprintf(fp, " %s", "new world");

    fclose(fp);

    return 0;
}

结果:

在这里插入图片描述

2、fread()

用于从文件中读入一定大小数据到指定的地址中。

函数原型

size_t fread(void *__restrict____ptr, size_t __size, size_t__n, FILE *__restrict__ __stream)
  • __restrict____ptr :这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
  • size_t __size :这是要读取的每个元素的大小,以字节为单位。
  • size_t__n :这是元素的个数,每个元素的大小为 size 字节。
  • restrict __stream: 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。

函数返回值

成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型。如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。

实例 1:

uint8_t text_file_fread() {
    FILE* fp;
    char c[] = "We are in 2022 new world";
    char buffer[30];

    /* 打开文件用于读写 */
    fp = fopen("file.txt", "w+");

    /* 写入数据到文件 */
    fwrite(c, sizeof(c), 1, fp);

    /* 查找文件的开头 */
    fseek(fp, 0, SEEK_SET);

    /* 读取并显示数据 */
    fread(buffer, sizeof(c), 1, fp);
    printf("%s\n", buffer);
    fclose(fp);
    return 0;
}

结果:

在这里插入图片描述

3、fwrite()

函数声明

往文件里面写信息

size_t fwrite(const void *__restrict____ptr, size_t __size, size_t __n, FILE *__restrict____s)
  • __restrict____ptr :这是指向要被写入的元素数组的指针。
  • size_t __size :这是要被写入的每个元素的大小,以字节为单位。
  • size_t __n :这是元素的个数,每个元素的大小为 size 字节。
  • __restrict____s :这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。

函数返回值

如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误。

实例1:

uint8_t text_file_fwrite() {
    FILE* fp;
    char str[55];
    memset(str,'B',55);

    fp = fopen("file.txt", "w");
    fwrite(str,sizeof(char), sizeof(str)/sizeof(char), fp);

    fclose(fp);
    return 0;
}

结果

在这里插入图片描述

实例 2

uint8_t text_file_fwrite() {
    FILE* fp;
    char str[] = "we are in 2060";

    fp = fopen("file.txt", "w");
    fwrite(str,sizeof(char), sizeof(str)/sizeof(char)-1, fp);

    fclose(fp);
    return 0;
}

结果

在这里插入图片描述

注意

如果:

fwrite(str,sizeof(char), sizeof(str)/sizeof(char), fp);

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

4、fseek()

实现偏移

函数原型:

int fseek(FILE *c, long __off, int __whence)
  • __stream:这是指向 FILE 对象的指针,该 FILE 对象标识了流。
  • __off:这是相对 whence 的偏移量,以字节为单位。
  • __whence:这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一

SEEK_SET 文件的开头
SEEK_CUR 文件指针的当前位置
SEEK_END 文件的末尾

函数返回值:

如果成功,则该函数返回零,否则返回非零值。

实例:

uint8_t text_file_fseek() {
    FILE* fp;

    fp = fopen("file.txt", "w+");
    fputs("we are in 2060", fp);

    fseek(fp, 7, SEEK_SET); // 根据偏移掺入数据
    fputs("where are you from ?", fp);
    fclose(fp);
    return 0;
}

结果:

在这里插入图片描述

5、ftell()

函数原型:

long ftell(FILE *__stream)
  • __stream:这是指向 FILE 对象的指针,该 FILE 对象标识了流。

函数返回值:

该函数返回位置标识符的当前值。如果发生错误,则返回 -1L,全局变量 errno 被设置为一个正值。

实例:

uint8_t text_file_ftell() {
    FILE* fp;
    int len;

    fp = fopen("file.txt", "r");
    if (fp == NULL) {
        perror("打开文件错误");
        return (-1);
    }
    fseek(fp, 0, SEEK_END);

    len = ftell(fp);
    fclose(fp);

    printf("file.txt 的总大小 = %d 字节\n", len);
    return 0;
}

结果:

在这里插入图片描述

6、fclose()

函数原型:

int fclose(FILE *__stream)
  • __stream:这是指向 FILE 对象的指针,该 FILE 对象标识了流。

函数返回值:

如果流成功关闭,则该方法返回零。如果失败,则返回 EOF。

实例:

前面每一个例子都要用到
参考:

1、C语言fopen函数的用法,C语言打开文件详解
2、fopen 菜鸟
3、fread 菜鸟
4、fwrite 菜鸟
5、fseek 菜鸟
6、ftell 菜鸟
7、fclose 菜鸟

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

li星野

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

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

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

打赏作者

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

抵扣说明:

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

余额充值