前言
我想实现一个功能,就是打开一个文件,然后按照某个特定的区块来读取它,将每个区块加密之后再写入到另一个文件中。
但很快,我发现了一个问题,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));
问题解决