fwrite函数,fread函数和fgets函数详解以及使用方法

c/c++文件处理函数

1. fgets函数

函数原型

char *fgets(char *s, int size, FILE *stream);

参数解释:

  1. s 代表要保存到的内存空间的首地址,可以是字符数组名,也可以是指向字符数组的字符指针变量名。
  2. size 代表的是读取字符串的长度。
  3. stream 表示从何种流中读取,可以是标准输入流

当读到一个新行或者是一个EOF标志时,fgets()就会结束,并且这个函数会自动给末尾加’\0’。

fgets()读一次只读size个字节,而且其中把’\0’也包括在内。

2.fwrite 函数

  • 二进制文件读写两个重要的函数 , fread 和 fwrite , fread 用于读取文件 , fwrite 用于写出文件 ;

  • fread / fwrite 函数 既可以操作 二进制文件 , 又可以操作 文本文件 ;

  • getc / putc 函数 , fscanf / fprintf 函数 , fgets / fgets 函数 , 只能用于操作 文本文件 ;

函数原型 :

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

参数解释 :

const void *ptr : 指针指向要写出数据的内存首地址 ;

size_t size : 要写出数据的 基本单元 的字节大小 , 写出单位的大小 ;

size_t nmemb : 要写出数据的 基本单元 的个数 ;

FILE *stream : 打开的文件指针 ;

返回值说明 : size_t 返回值返回的是实际写出到文件的 基本单元 个数 ;

简单示例
#include 

int main()
{
    // 使用 "wb" 二进制写的方式打开文件
    FILE *p = fopen("D:\\a.txt", "wb");

    // 用于写出数据的缓冲区
    char buffer[1024] = {0};

    // 设置缓冲区数值
    buffer[0] = 'H';
    buffer[1] = 'e';
    buffer[2] = 'l';
    buffer[3] = 'l';
    buffer[4] = 'o';

    // buffer : 将指针对应的内存的写出到文件中
    // sizeof(char) : 写出的基本单元字节长度
    // sizeof(buffer) : 写出的基本单元个数,
    //       写出字节个数是 sizeof(buffer) * sizeof(char)
    // p : 文件指针
    // 返回值 : fwrite 函数返回值表示写出到的 基本单元 的个数
    size_t count = fwrite(buffer, sizeof(char), 5, p);

    // 打印写出的内容和写出的 基本单元 个数
    printf("fread : buffer = %s , write count = %u\n", buffer, count);

    // 逐个字节打印读取出数据的 ASCII 码
    int i = 0;
    for(i = 0; i < count; i ++){
        printf("buffer[%d] = %x, %c\n", i, buffer[i], buffer[i]);
    }

    printf("Main End\n");
    return 0;
}

执行结果 :

fread : buffer = Hello , write count = 5
buffer[0] = 48, H
buffer[1] = 65, e
buffer[2] = 6c, l
buffer[3] = 6c, l
buffer[4] = 6f, o
Main End
fwrite 示例 ( 写出数据超出实际有效值 )

fwrite 函数示例 : 在上面的示例中 , 只给缓冲区设置了 5 55 个字节的数据 , 即 " Hello " 字符 , 只向文件写出 5 字节数据 ; 但是如果写出 20 个字节 , 就会将后续的 15 个字节的 ‘\0’ 也进行写出 ;

#include 

int main()
{
    // 使用 "wb" 二进制写的方式打开文件
    FILE *p = fopen("D:\\a.txt", "wb");

    // 用于写出数据的缓冲区
    char buffer[1024] = {0};

    // 设置缓冲区数值
    buffer[0] = 'H';
    buffer[1] = 'e';
    buffer[2] = 'l';
    buffer[3] = 'l';
    buffer[4] = 'o';

    // buffer : 将指针对应的内存的写出到文件中
    // sizeof(char) : 写出的基本单元字节长度
    // sizeof(buffer) : 写出的基本单元个数,
    //       写出字节个数是 sizeof(buffer) * sizeof(char)
    // p : 文件指针
    // 返回值 : fwrite 函数返回值表示写出到的 基本单元 的个数
    size_t count = fwrite(buffer, sizeof(char), 20, p);

    // 打印写出的内容和写出的 基本单元 个数
    printf("fread : buffer = %s , write count = %u\n", buffer, count);

    // 逐个字节打印读取出数据的 ASCII 码
    int i = 0;
    for(i = 0; i < count; i ++){
        printf("buffer[%d] = %x, %c\n", i, buffer[i], buffer[i]);
    }

    printf("Main End\n");
    return 0;
}

运行结果:
fwrite函数,fread函数和fgets函数详解以及使用方法_第1张图片

3.fread函数

fread 函数作用 : 从文件中读取若干字节数据到内存缓冲区中 ;

fread 函数原型 :

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
  1. void *buffer 参数 : 将文件中的二进制数据读取到该缓冲区中 ;

  2. size_t size 参数 : 读取的 基本单元 字节大小 , 单位是字节 , 一般是 buffer 缓冲的单位大小 ;

    如果 buffer 缓冲区是 char 数组 , 则该参数的值是 sizeof(char) ;
    如果 buffer 缓冲区是 int 数组 , 则该参数的值是 sizeof(int) ;

  3. size_t count 参数 : 读取的 基本单元 个数 ;

  4. FILE *stream 参数 : 文件指针 ;

  5. size_t 返回值 : 实际从文件中读取的 基本单元 个数 ; 读取的字节数是 基本单元数 * 基本单元字节大小 ;

代码示例 : 一次性读满整个缓冲区 ;

#include 

int main()
{
    // 使用 "rb" 读取二进制方式打开文件 a.txt:hello
    FILE *p = fopen("D:\\a.txt", "rb");

    // 用于接收读取数据的缓冲区
    char buffer[1024] = {0};

    // buffer : 将文件读取到内存的位置
    // sizeof(char) : 读取的基本单元字节长度
    // sizeof(buffer) : 读取的基本单元个数,
    //       读取字节个数是 sizeof(buffer) * sizeof(char)
    // p : 文件指针
    fread(buffer, sizeof(char), sizeof(buffer), p);

    // 打印读取的内容
    printf("buffer = %s\n", buffer); // buffer = hello

    printf("Main End\n");
    return 0;
}

你可能感兴趣的:(c++基础知识点,c语言)