Bootstrap

文件操作管理

目录

文件管理

fopen

​编辑perror

fputc

fgetc

feof

fgets

fputs

fprintf

fscanf

fwrite

fread

fseek

 ftell

struct stat

remove

rename

更新缓存区


文件管理

当启动一个程序时,系统会打开3个设备文件(stdin(标准输入文件(键盘)))、(stdout(标准输出文件(终端(屏幕))))、stderr(标准错误文件(终端(屏幕))));

fopen

在C语言中,fopen 是一个用于打开文件的标准库函数,它的声明在 <stdio.h> 头文件中。fopen 函数提供了一种在程序中访问文件的方法,可以用于读取文件内容、写入新内容或者进行文件的其他操作。

perror

perror是一个标准库函数,用于打印上一个发生的错误信息。它通常用于在程序出现错误时输出与 errno 相关的错误消息,方便程序员进行调试和错误处理。

fputc

 

#include <stdio.h>
#include <stdlib.h> 

#define FILENAME "./记录文件.txt"

FILE *open_file(char *mode)
{
    FILE *fp = fopen(FILENAME, mode);  // 使用宏定义 FILENAME 作为文件名
    if (!fp)
    {
        perror("打开失败");  // 打印错误信息
        exit(1);  // 退出程序
    }

    return fp;  // 返回文件指针
}

int main()
{
    FILE *fp = open_file("w");  // 使用 "w" 模式打开文件

    if (fputc('A', fp) == EOF) {
        perror("写入失败");
        return 1;
    }

    printf("字符写入成功\n");

    fclose(fp); // 关闭文件

    return 0;
}

 

fgetc

 把字符串hello world写入记录文件.txt中

#include <stdio.h>
#include <stdlib.h> 

#define FILENAME "./记录文件.txt"

FILE *open_file(char *mode)
{
    FILE *fp = fopen(FILENAME, mode);  // 使用宏定义 FILENAME 作为文件名
    if (!fp)
    {
        perror("打开失败");  // 打印错误信息
        exit(1);  // 退出程序
    }

    return fp;  // 返回文件指针
}

int main()
{
    FILE *fp = open_file("w");  // 使用 "w" 模式打开文件
    char str[] = "hello world\n";
    int i = 0;
    while (str[i] != 0)
    {
        fputc(str[i++], fp);
    }

    fclose(fp); // 关闭文件

    return 0;
}

从记录文件.txt中,把字符串hello world读出

#include <stdio.h>
#include <stdlib.h> 

#define FILENAME "./记录文件.txt"

FILE *open_file(char *mode)
{
    FILE *fp = fopen(FILENAME, mode);  // 使用宏定义 FILENAME 作为文件名
    if (!fp)
    {
        perror("打开失败");  // 打印错误信息
        exit(1);  // 退出程序
    }

    return fp;  // 返回文件指针
}

int main()
{
    FILE *fp = open_file("r");  // 使用 "r" 模式打开文件
    char str[128] = "";
    int i = 0;
    while ((str[i++] = fgetc(fp)) != EOF);
    printf("%s",str);

    fclose(fp); // 关闭文件

    return 0;
}

 

还可以读取二进制文件

#include <stdio.h>
#include <stdlib.h>

FILE *open_file(char *filename, char *mode)
{
    FILE *fp = fopen(filename, mode);
    if (!fp)
    {
        perror("打开失败");
        exit(1);
    }
    return fp;
}

int main()
{
    FILE *fp = open_file("./原图片.png", "rb");
    FILE *fp1 = open_file("./新图片.png", "wb");

    char ch;
    while (1)
    {
        ch = fgetc(fp);
        if(feof(fp))
            break;
        fputc(ch, fp1);
    }

    fclose(fp); // 关闭文件
    fclose(fp1);

    return 0;
}

原图片 

 新图片

feof

#include <stdio.h>
#include <stdlib.h> 

#define FILENAME "./记录文件.txt"

FILE *open_file(char *mode)
{
    FILE *fp = fopen(FILENAME, mode);  // 使用宏定义 FILENAME 作为文件名
    if (!fp)
    {
        perror("打开失败");  // 打印错误信息
        exit(1);  // 退出程序
    }

    return fp;  // 返回文件指针
}

int main()
{
    FILE *fp = open_file("r");  // 使用 "r" 模式打开文件
    char str[128] = "";
    int i = 0;
    do{
        str[i++] = fgetc(fp);
    }while (!feof(fp));
    printf("%s",str);

    fclose(fp); // 关闭文件

    return 0;
}

fgets

fgets 函数用于从文件中读取一行文本

char *fgets(char *str, int n, FILE *stream);

 fgets 函数会从 stream 中读取字符,直到遇到换行符 \n、文件结尾 EOF 或者读取了 n-1 个字符(视先达到哪个条件而定),然后将读取的内容存储在 str 中,并在末尾添加空字符 \0。如果成功读取到内容,返回 str;如果遇到错误或者读取到文件结尾,返回 NULL

#include <stdio.h>
#include <stdlib.h>

FILE *open_file(char *filename, char *mode)
{
    FILE *fp = fopen(filename, mode);
    if (!fp)
    {
        perror("打开失败");
        exit(1);
    }
    return fp;
}

int main()
{
    FILE *fp = open_file("./记录文件.txt", "r");

    char buf[1024] = "";
    fgets(buf, sizeof(buf), fp);
    printf("%s",buf);

    fclose(fp); // 关闭文件

    return 0;
}

 

fputs

fputs 函数用于向文件中写入字符串

int fputs(const char *str, FILE *stream);

fputs 函数会将 str 指向的字符串写入到 stream 指定的文件中,直到遇到空字符 \0。成功时返回非负数,出错时返回 EOF

#include <stdio.h>
#include <stdlib.h>

FILE *open_file(char *filename, char *mode)
{
    FILE *fp = fopen(filename, mode);
    if (!fp)
    {
        perror("打开失败");
        exit(1);
    }
    return fp;
}

int main()
{
    FILE *fp = open_file("./记录文件.txt", "w");

    char buf[1024] = "abcdefg";
    fputs(buf, fp);

    fclose(fp); // 关闭文件

    return 0;
}

fprintf

fprintf 是 C 标准库中用于格式化输出到文件的函数,其功能类似于 printf 函数,但是可以指定输出到一个文件流中。

int fprintf(FILE *stream, const char *format, ...);

#include <stdio.h>
#include <stdlib.h>

FILE *open_file(char *filename, char *mode)
{
    FILE *fp = fopen(filename, mode);
    if (!fp)
    {
        perror("打开失败");
        exit(1);
    }
    return fp;
}

int main()
{
    char name[] = "John";
    int age = 30;

    FILE *fp = open_file("./记录文件.txt", "w");
    fprintf(fp, "Name: %s\nAge: %d\n", name, age); // 输出到文件

    fclose(fp); // 关闭文件

    return 0;
}

 

fscanf

fscanf 是 C 标准库中用于从文件中读取格式化数据的函数,类似于 scanf 函数,但是可以从指定的文件流中读取输入数据。

int fscanf(FILE *stream, const char *format, ...);

#include <stdio.h>
#include <stdlib.h>

FILE *open_file(char *filename, char *mode)
{
    FILE *fp = fopen(filename, mode);
    if (!fp)
    {
        perror("打开失败");
        exit(1);
    }
    return fp;
}

int main()
{
    char name[128] = "";
    int age = 0;

    FILE *fp = open_file("./记录文件.txt", "r");
    // 从文件中读取数据
    fscanf(fp, "Name: %s\nAge: %d\n", name, &age);

    printf("Name: %s\n", name); // 输出读取到的数据
    printf("Age: %d\n", age);

    fclose(fp); // 关闭文件

    return 0;
}

 

fwrite

fwrite 是 C 标准库中用于将数据块写入文件的函数。它允许你指定要写入的数据块的大小、数量和目标文件流,是一个高效的二进制数据输出函数。

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

#include <stdio.h>
#include <stdlib.h>

typedef struct std
{
    char name[16];
    int age;
}STD;


FILE *open_file(char *filename, char *mode)
{
    FILE *fp = fopen(filename, mode);
    if (!fp)
    {
        perror("打开失败");
        exit(1);
    }
    return fp;
}

int main()
{
    STD name[3] = {{"as",18},{"bs",20},{"cs",25}};

    FILE *fp = open_file("./记录文件.txt", "w");
    int count = fwrite(name,1,sizeof(name),fp);

    printf("count: %d\n", count);

    fclose(fp); // 关闭文件

    return 0;
}

fread

fread 是 C 标准库中用于从文件中读取数据块的函数,与 fwrite 相对应。它允许你从文件中读取指定大小和数量的数据块,并将其存储到内存中的指定位置。

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct std
{
    char name[16];
    int age;
}STD;


FILE *open_file(char *filename, char *mode)
{
    FILE *fp = fopen(filename, mode);
    if (!fp)
    {
        perror("打开失败");
        exit(1);
    }
    return fp;
}

int main()
{
    STD name[3];
    memset(name,0,sizeof(name));

    FILE *fp = open_file("./记录文件.txt", "r");
    for(int i = 0; i < 3; i ++)
    {
        int count = fread(&name[i],1,sizeof(STD),fp);
        printf("count: %d\n", count);
        printf("name:%s\tage:%d\n", (&name[i])->name,name[i].age);
    }

    fclose(fp); // 关闭文件

    return 0;
}

fseek

移动光标

 ftell

ftell 是 C 标准库中的一个函数,用于获取文件流的当前位置(即文件指针的偏移量)。它的原型定义在 <stdio.h> 头文件中。

long int ftell(FILE *stream);

ftell 返回的位置是从文件开头到当前文件指针位置的字节数。对于二进制文件,这通常是文件中的实际字节数;对于文本文件,由于可能存在换行符等特殊字符,返回的字节数可能不是预期的行数。

struct stat

struct stat 是一个用于描述文件状态的结构体,通常在 UNIX/Linux 系统上用于获取文件的详细信息。它定义在 <sys/stat.h> 头文件中。

 struct stat {
    dev_t     st_dev;         /* ID of device containing file */
    ino_t     st_ino;         /* inode number */
    mode_t    st_mode;        /* protection */
    nlink_t   st_nlink;       /* number of hard links */
    uid_t     st_uid;         /* user ID of owner */
    gid_t     st_gid;         /* group ID of owner */
    dev_t     st_rdev;        /* device ID (if special file) */
    off_t     st_size;        /* total size, in bytes */
    blksize_t st_blksize;     /* blocksize for filesystem I/O */
    blkcnt_t  st_blocks;      /* number of 512B blocks allocated */
    time_t    st_atime;       /* time of last access */
    time_t    st_mtime;       /* time of last modification */
    time_t    st_ctime;       /* time of last status change */
};

结构体成员解释

  1. st_dev: 包含文件的设备 ID。
  2. st_ino: 文件的 inode 号码。
  3. st_mode: 文件的权限和类型(比如普通文件、目录等)。
  4. st_nlink: 文件的硬链接数。
  5. st_uid: 文件所有者的用户 ID。
  6. st_gid: 文件所有者的组 ID。
  7. st_rdev: 如果文件是特殊文件(比如设备文件),则包含设备 ID。
  8. st_size: 文件的大小,以字节为单位。
  9. st_blksize: 文件系统 I/O 的块大小。
  10. st_blocks: 文件分配的块数,每块大小为 512 字节。
  11. st_atime: 文件最后访问时间。
  12. st_mtime: 文件最后修改时间。
  13. st_ctime: 文件状态最后更改时间(比如权限更改)。

remove

在 C 语言中,remove() 函数是用来删除文件的标准库函数,其功能是将指定的文件从文件系统中删除。

int remove(const char *filename);

rename

在 C 语言中,rename() 函数用于重命名文件或者将文件移动到另一个位置。

更新缓存区

刷新缓冲区的方法,3种
a>缓冲区满
b>fflush函数强制刷新
c>程序正常退出

fflush

在 C 语言中,fflush() 函数用于刷新流的缓冲区,确保数据被写入到对应的文件或者设备中。

int fflush(FILE *stream);

stream:指向 FILE 结构体的指针,表示要刷新的流。常见的流包括标准输入 stdin、标准输出 stdout 和标准错误 stderr,以及通过 fopen() 打开的文件流。

;