文章目录

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 菜鸟