【C/C++】fread函数与C语言基础的一些讲解

文章目录

前言

我想实现一个功能,就是打开一个文件,然后按照某个特定的区块来读取它,将每个区块加密之后再写入到另一个文件中。

但很快,我发现了一个问题,fread函数似乎没办法正常完整读取文件?

以下是我的源代码主要部分

uint8_t data[33] = {0};
FILE *fp = fopen("文件名", "rb");
do {
	fread(data, 1, 32, fp);
	printf("%s", data);
} while(!feof(fp));

文件的原内容是这样的

12345678901234567890123456789012...........-=/

经过上面的代码之后,输出结果是这样的。

12345678901234567890123456789012...........-=/567890123456789012

看起来就像是文件并没有被完整读取或者很好的读取,是fread函数的问题吗?

解决

其实这和fread函数没啥太大的关系。

首先我们先来看一下此函数是什么样的。

size_t fread(void *_DstBuf, size_t _ElementSize, size_t _Count, FILE *_File);

可以看到它有四个参数

  • void *_DstBuf,代表你一会用哪个变量来接收读取的数据
  • size_t _ElementSize,代表这个类型的数据单位长度,比如uint8_t是1字节,uint32_t是4字节
  • size_t _Count,代表本次读取总共多少数据,比如 fread(data, 1, 32, fp) 代表的是用一个uint8_t变量data来接收32字节的数据,单个数据的类型为unsigned char(也就是uint8_t)
  • FILE *_File,这个我想我不用介绍了吧。
  • 那么话说回来,为什么会发生前面那种这种情况呢?

    因为变量data没有每次进行初始化,导致上一次读取的数据还保留在data变量中。
    对于小白来说可能这句话不是很好理解,下面我举个例子。


    书柜有32个空位可以放书,第一次放了32本文学类的书,第二次放了32本科学类的书,第三次只放了16本计算机的书,这样原本那32本科学类的书就还有16本留在了书柜里面,所以导致看起来书的类型会很杂乱。

    解决方法为使用一个可以初始化变量的函数每次对变量进行初始化

    uint8_t data[33] = {0};
    FILE *fp = fopen("文件名", "rb");
    do {
    	memset(data, 0, 32); // 此处我使用memset函数
    	fread(data, 1, 32, fp);
    	printf("%s", data);
    } while(!feof(fp));
    

    问题解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值