1.前述:
1)因为是要对二进制文件进行读写操作,所以比如在文件打开的时候以 'b'方式(二进制方式)打开。
2)用这种方式,可以在多个进程在通过该二进制文件读取内容,比如从一PC保存内容后该二进制文件转移到另一PC下使用时可以获取该内容。
2.例子:追加写入读取二进制文件内容
1)声明
struct TestStruct
{
char *szText;
int nLength;
.......
}
2)写入
TestStruct aTest;
memset(&aTest, 0, sizeof(TestStruct));
{初始化aTest......}
//以二进制方式打开文件,并这
FILE *fStream = fopen(szFileName, 'ab');
//获取结构内容的长度
int nWriteLength = sizeof(TestStruct);
//写入内容,一个该内容的需要nWriteLength长度的空间
fwrite(aTest, nWriteLength, 1, fStream);
//记录内容的长度进文件,用来在读取时获取内容
fwrite(&nWriteLength, sizeof(int), 1, fStream);
fclose(fStream);
fStream = NULL;
3)读取
TestStruct aTest;
memset(&aTest, 0, sizeof(TestStruct));
//开打文件
FILE *fStream = fopen(szFileName, 'rb');
//记录需要读出的二进制内容长度
int nConfigLen = 0;
//跳转到文件的最后一个内容(刚才写入的时候是以 sizeof(int) 容量写入了一个 int)
fseek(fStream, 0-sizeof(int), SEEK_END);
//从文件末尾读取一个int(需要获取的信息内容长度)
fread(&nConfigLen, sizeof(int), 1, fStream);
// 申请内存
char *buf = new char[nConfigLen+1];
memset(buf, 0, nConfigLen+1);
// 移动文件指针至需要读取的信息的起始处
fseek(fStream, 0-sizeof(int)-nConfigLen, SEEK_END);
// 读取信息
fread(buf, 1, nConfigLen, fStream);
fclose(fStream);
fStream = NULL;
//将获取出来的二进制内容拷贝给我们需要的结构
memcpy(aTest, buf, szieof(TestStruct));
//不要忘记删除分配的堆空间
delete [] buf;
3.例子的流程详解
1)例子对二进制文件的操作结构图
//................................................................//(->原文件的结束)[XXXXXXXX]((1)我们加入的内容)[int]((2)加入内容的长度){文件的结束} |
(1)下的内容都是追加的二进制信息。
(2)是追加内容的长度,用来确定读取的内容到底多少合适。
2)写入的流程:
(1)写入内容,该内容单位一个所占的空间大小。
(2)保存所写入的内容内所占的空间长度。
3)读取的流程:
(1)指针定位到最后一个内容。(该内容为写入的内容内所占的空间长度的信息)[0-sizeof(int):因为是从后向前偏移,所以用负值]
(2)先读出最好一个保存写入的内容内所占的空间长度的信息。
(3)根据长度信息定位到内容起始位置。
(4)读取内容,保存在足够的 char[] buf 空间中。
(5)用memcpy 方式将 buf 的内容拷贝给需要的参数即可。
4)这种传值方法是一种通用内容传递方法,不管是从文件到文件的内容读写,还是socket, NamePipe 等,都可以用来传递非标准类型内容。