C程序读取一个Bin文件数据,然后存入另一个Bin文件
最近工作遇到需要bin文件数据处理,对程序语言其实不大熟悉,还是凭着一些浅显的C语言基础,各种折磨一天时间才实现了工作需求,好了,废话不多说,直接上正题;
预期目标:将data.bin文件中以00 28 00 开头的单独读取出来后,并写入新建的data1.bin文件中。如下图
对于bin文件我就不多说了,因为用的比较少,只知道它是二进制数据文件,因为方便芯片烧录因此拿来用下。大致说明下上图中,offset为每一行的偏置量,可以理解为每一行行首的字节位置。我们需求是每16个字节为一条指令,当然这是可变的,后面“;”之后的便是前面数据对应的ASCII值。
**下面便是我的代码,聊做记录**
#include <stdio.h>FILE *fi, *fo;char fni[511] = "data.bin";char fno[511] = "data1.bin";int c, n, i;int main() {fi = fopen(fni, "rb");if (NULL == fi) {fprintf(stderr, "Can not open file %s!\n", fni);return 1;}fo = fopen(fno, "wb");if (NULL == fo) {fclose(fi);fprintf(stderr, "Can not create file %s!\n", fno);return 2;}n = 0;i = 1;while (1) {c = fgetc(fi);if (EOF == c) break;fprintf(fo, "%c", c);n++;if ((n % 16) == 0){//fprintf(fo, "\n");for (i = 1; i < 17; i++){c = fgetc(fi);}n = n + 16;}}fclose(fo);fclose(fi);
运行结果:
值得注意的一点是:
==1、==在代码中,fprintf(fo, “\n”); 这条其实是多余的,因为本来data.bin就是16个字节为一条,不需要在进行一次换行。而且在加上这句后,执行后相应位置会出现0D 0A,这就是在C语言读取到边界位置时多读取了“\n”后出现的无意义数值,如下图。
==2、==bin文件的打开读取或者写入,应该是二进制的,方式都必须加“b”例如:“wb”、“rb”,并且必须注意我们读取用的是fgetc(),它读取的是一个字符,在往data1.bin文件中写入时,实际写入位置在ASCII区域,因此需要确定格式为字符写入,不然就会出现错误例如下图: