文件操作之fread函数和fwrite函数

文件操作之fread函数和fwrite函数

数据块写函数-fwrite
  • 格式:使用手册man一下
size_t
     fwrite(const void *restrict ptr, size_t size, size_t nitems,
         FILE *restrict stream);
  • 含义:从文件指针ptr所指向的内存中读入数据,写入文件stream所指的文件中,写入nitems次数的数据块,每块大小为size字节。
数据块写函数-fread
  • 格式:使用手册man的结果
size_t
     fread(void *restrict ptr, size_t size, size_t nitems,
         FILE *restrict stream);
  • 含义:从文件指针stream所指的文件中读入nitems次数据块,每块的大小为size字节,并保存到文件指针所指向的内存中

注意:fread函数和fwrite函数的返回值是size_t, 返回的是执行写操作的次数,我们在fread函数中可以设置每次读的size,nitems读的次数。因此,可以利用这个特性,在代码中判断一下是否读的正确。
另外,因为我们在函数的使用中,一旦发现文件打不开,或者找不到,又或者数据未写入、未读入等问题,需要用exit(1)来结束程序,所以头文件中必须包含
#include

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

#define NAMELEN 20
#define STUNUM  5

//1.需要构造表示学生信息的类型struct

typedef struct student
{
    char name[NAMELEN];
    int age;
    int stuID;
}STU;


//2.需要构造一个表示学生名字的数组
char students[STUNUM][NAMELEN] = 
{
    "zhangsan",
    "lisi",
    "wangwu",
    "zhaoliu",
    "xiaoqi"
};

int main (int argc, const char *argv[])
{
    //声明一个表示文件的指针
    FILE *fp = NULL;
    //打开文件,以写的操作模式
    fp = fopen ("/Users/qingyun/Desktop/stu.txt","w");
    //判断文件是否打开成功,如果打开失败,则需要退出程序
    if (NULL == fp)
    {
        puts("open file:stu.txt error");
        exit(1);
    }

    STU stus[STUNUM] = {0};
    //如果打开成功,构造学生信息
    for (int i = 0; i < STUNUM;i++)
    {
        strncpy(stus[i].name,students[i],NAMELEN);
        stus[i].age = 20+i;
        stus[i].stuID = i;
    }
    //将学生信息写入到文件里fwrite
    size_t nWriteCount = fwrite(stus,sizeof(STU),STUNUM,fp);

    //目的是确认, 是否正确定写入了所有内容
    if (nWriteCount != STUNUM )
    {
        puts("write file error");
        exit(1);
    }
    //关闭文件
    fclose(fp);
    return 0;
}

内容是定义了一个二维数组,还有一个结构体,用只输入name,其他内容自动生成的方式。

接下来是第二部分,使用fread读出来,验证下刚才写的内容是否正确

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

#define STULEN 20
#define STUNUM 5
//构造表示学生类型的数据结构 struct
typedef struct students
{
    char name[STULEN];
    int age;
    int stuID;
}STU;

int main(int argc,const char *argv[])
{
    // 声明一个文件指针
    FILE *fp = NULL;
    // 打开文件指针
    fp = fopen("/Users/qingyun/Desktop/stu.txt","r");
    // 判断文件是否打开成功,如果失败则退出程序
    if (NULL == fp)
    {
        puts("Open file error!");
        exit(1);
    }
    // 声明一个缓冲区,用于存放文件的内容
    STU stus[STUNUM] = {0};

    // 若打开成功,则使用 fread 来读取文件内容
    int nReadCounts = fread(stus,sizeof(STU),STUNUM,fp);
    // 根据文件函数的返回值来判断文件是否读成功了
    if (nReadCounts != STUNUM)
    {
        puts("Read file error!\n");
        exit(1);
    }
    //若读取成功的话,打印到屏幕上
    for (int i = 0;i < STUNUM;i++)
    {
        printf("the [%d] student info:name is %s,age is %d,stuID is %d\n",i,stus[i].name,stus[i].age,stus[i].stuID);
     }
    // 关闭文件指针
    fclose(fp);
    return 0;

}

附上显示结果

the [0] student info:name is zhangsan,age is 20,stuID is 0
the [1] student info:name is lisi,age is 21,stuID is 1
the [2] student info:name is wangeu,age is 22,stuID is 2
the [3] student info:name is zhaoliu,age is 23,stuID is 3
the [4] student info:name is xiaoqi,age is 24,stuID is 4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值