目标:仅仅从某一文件读取一次,就能对结构体的整体完成赋值。而不是每次提取一个数据,再赋值给结构体的某一元素,然后循环,显得麻烦
原理:无论是结构体还是结构体数组在内存都是连续地址的内容,只是中间会有填充内容,以达到对齐的效果。但如果我们将数据连同填充一起写入文件,这样相当于把地址空间copy了一份到文件中,读的时候再copy回来,不就完成了整个结构体的读取了吗。这样就不用考虑常规方法中解析文件内容等问题。
#include
#include
#include
#include
using namespace std;
struct MyStruct
{
int id;
char name[20];
float score;
};
int main()
{
MyStruct myList[3];
myList[0].id = 1;
strcpy_s(myList[0].name, "zhang");
myList[0].score = 60.0;
myList[1].id = 2;
strcpy_s(myList[1].name, "wang");
myList[1].score = 70.0;
fstream myFile("test.txt", ios::out | ios::binary);
myFile.write((char*)myList, sizeof(MyStruct) * 3);//将结构体数组整体写入
myFile.close();
fstream myFileReader("test.txt", ios::binary | ios::in);
memset(myList, '\0', sizeof(MyStruct) * 3);
myFileReader.read((char*)myList, sizeof(MyStruct) * 3);
for (int i=0;i < 3;i++) {
printf("id:%d\n", myList[i].id);
printf("name:%s\n", myList[i].name);
printf("score:%f\n", myList[i].score);
}
}
使用write函数从内存整体写入到文件中,使用read函数从文件整体读取到内存中。
运行结果:
可以看到,从文件中读取数据没有问题。
代码中我只对结构体数组中的前两个进行了赋值,因此最后一个没有数据。但这里也有问题,我明明使用了memset(myList, '\0', sizeof(MyStruct) * 3);将这块内存区域全部赋值为0,怎么会是乱码呢。(感觉烫烫烫对应了空,奇怪奇怪)
注意:对文件内容进行修改,必须通过write()方法,而不能直接打开文件里改,不然会乱码,如下图。
思考原因,我猜想是因为数据流并不是以字节的形式传输的,而是二进制,在字节码层面修改会导致无法对齐格式。