前言:二进制文件与文本文件的区别:
文本文件:写入数字n,实际是写入的字符n;
二进制文件:写入数字n,实际是写入的整数n。
有了这个概念,我们继续往下进行~
一、准备一个txt格式的文件。
我这里准备了一个txt格式的文件,部分内容如下:
注:这里txt中的数据是以“空格”的形式分隔开的。
二、操作txt文件内容
1、其中一种读取方式
const char* fileName = "C://Users//lenovo//Desktop//123.txt"; //文件路径
FILE* fp = fopen(fileName, "r+"); //以读的方式打开123.txt文件
if (fp == NULL) return 0; //空指针则返回0,文件打开失败
fseek(fp, 0, SEEK_END); //将文件指针移动至文件末尾
size_t size = ftell(fp); //计算文件大小,单位:Byte
fseek(fp, 0, SEEK_SET); //把文件指针移回初始位置(文件开头)
char* data; //用于存放txt中内容的字符串指针
data = (char*)malloc(sizeof(char)*size); //给data分配内存
fread(data,size, 1, fp); //将txt文件中的内容读取到字符串data中
2、去除字符串中的空格(一种笨方法,因为使用vc6.0编译的,网上的方法使用起来有些问题,这里就自己写的)
string ss = ""; //用于拼接非空格字符串
for (int j=0;j<ss.size();j++)
{
if (data[j] != ' ') //若当前字符不为空格
{
ss += data[j]; //拼接字符
}
}
3、将char类型数据转化为unsigned short类型数据
for (int j=0;j<ss.size();j++) //去除data中的空格
{
if (data[j] != ' ')
{
ss += data[j];
}
}
for (int i=0; i<ss.size(); i++)
{
if (i%2 == 0) //取数据偶数位,即我需要的一个字节的高4位
{
if (ss[i] >= 'A') //若字符为字母
{
a = ss[i] - 'A' + 10; //因为是字符类型的,转化为int型是ASCII码值,“A”在十六进制中表示的是10,“B”是11,因此最后+10
}
else
{
a = ss[i] - '0';
}
}
else //取数据奇数位,即我需要的一个字节的低4位
{
if (ss[i] >= 'A')
{
b = ss[i] - 'A' + 10;
}
else
{
b = ss[i] - '0';
}
cc[nn] = (a << 4) + b; //将一个字节的低4位和高4位拼接成一个完整的字节
nn++;
}
}
三、将处理好的数据写入二进制文件中
文件写入代码如下:
FILE* fo = fopen("C://Users//lenovo//Desktop//123.bin", "wb+"); //以二进制写入方式打开123.bin文件(若没有123.bin文件,则自动创建)
fwrite(cc, (sizeof(cc) / sizeof(cc[0])), 1, fp); //将存放十进制数据的数组cc以二进制的方式写入到123.bin中
fclose(fo); //关闭文件操作句柄
四、完整代码如下:
const char* fileName = "C://Users//lenovo//Desktop//123.txt"; //文件路径
FILE* fp = fopen(fileName, "r+"); //以读的方式打开123.txt文件
if (fp == NULL) return 0; //空指针则返回0,文件打开失败
fseek(fp, 0, SEEK_END); //将文件指针移动至文件末尾
size_t size = ftell(fp); //计算文件大小,单位:Byte
fseek(fp, 0, SEEK_SET); //把文件指针移回初始位置(文件开头)
char* data; //用于存放txt中内容的字符串指针
data = (char*)malloc(sizeof(char)*size); //给data分配内存
fread(data,size, 1, fp); //将txt文件中的内容读取到字符串data中
string ss = ""; //不带空格的字符串
BYTE cc[256]; //存放最终数据的数组
memset(cc,0,256); //初始化cc数组
unsigned short a=0,b=0,temp=0,nn=0; //a为字节高4位,b为字节低4位,temp为临时变量,nn为计数变量
for (int j=0;j<ss.size();j++) //去除data中的空格
{
if (data[j] != ' ')
{
ss += data[j];
}
}
for (int i=0; i<ss.size(); i++)
{
if (i%2 == 0) //取数据偶数位,即我需要的一个字节的高4位
{
if (ss[i] >= 'A') //若字符为字母
{
a = ss[i] - 'A' + 10; //因为是字符类型的,转化为int型是ASCII码值,“A”在十六进制中表示的是10,“B”是11,因此最后+10
}
else
{
a = ss[i] - '0';
}
}
else //取数据奇数位,即我需要的一个字节的低4位
{
if (ss[i] >= 'A')
{
b = ss[i] - 'A' + 10;
}
else
{
b = ss[i] - '0';
}
cc[nn] = (a << 4) + b; //将一个字节的低4位和高4位拼接成一个完整的字节
nn++;
}
}
fclose(fp);
FILE* fo = fopen("C://Users//lenovo//Desktop//123.bin", "wb+"); //以二进制写入方式打开123.bin文件(若没有123.bin文件,则自动创建)
fwrite(cc, (sizeof(cc) / sizeof(cc[0])), 1, fp); //将存放十进制数据的数组cc以二进制的方式写入到123.bin中
fclose(fo); //关闭文件操作句柄
五、转化为二进制的文件内容如下:
注:上述是我使用的一种笨方法对文件进行的操作,因为水平有限,因此本文篇幅过长,下一章将介绍如何读取二进制文件,并将该二进制文件的内容再转化为十进制数据进行相关操作~
感谢大家的支持,有写的不对的地方欢迎大家指正~~~