最近我一直在问编写一个函数读取二进制文件到std::vector<BYTE>哪里BYTE是unsigned char.我很快就找到了这样的东西:
#include <fstream>
#include <vector>
typedef unsigned char BYTE;
std::vector<BYTE> readFile(const char* filename)
{
// open the file:
std::streampos fileSize;
std::ifstream file(filename, std::ios::binary);
// get its size:
file.seekg(0, std::ios::end);
fileSize = file.tellg();
file.seekg(0, std::ios::beg);
// read the data:
std::vector<BYTE> fileData(fileSize);
file.read((char*) &fileData[0], fileSize);
return fileData;
}
Run Code Online (Sandbox Code Playgroud)
这似乎是不必要的复杂,并且char*我在呼叫时被迫使用的明确演员file.read并没有让我感觉更好.
另一种选择是使用std::istreambuf_iterator:
std::vector<BYTE> readFile(const char* filename)
{
// open the file:
std::ifstream file(filename, std::ios::binary);
// read the data:
return std::vector<BYTE>((std::istreambuf_iterator<char>(file)),
std::istreambuf_iterator<char>()); …Run Code Online (Sandbox Code Playgroud) 我试图理解序列化/反序列化如何在不使用库的情况下在C++中工作.我从简单的对象开始,但是当反序列化向量时,我发现,如果没有先写入它的大小,我就无法获得向量.而且,我不知道应该选择哪种文件格式,因为如果在向量大小之前存在数字,我就无法正确读取它.此外,我想用类和映射容器来做到这一点.我的任务是序列化/反序列化这样的对象:
PersonInfo
{
unsigned int age_;
string name_;
enum { undef, man, woman } sex_;
}
Person : PersonInfo
{
vector<Person> children_;
map<string, PersonInfo> addrBook_;
}
Run Code Online (Sandbox Code Playgroud)
目前我知道如何序列化这样的简单对象:
vector<PersonInfo> vecPersonInfo;
vecPersonInfo.push_back(*personInfo);
vecPersonInfo.push_back(*oneMorePersonInfo);
ofstream file("file", ios::out | ios::binary);
if (!file) {
cout<<"can not open file";
} else {
vector<PersonInfo>::const_iterator iterator = vecPersonInfo.begin();
for (; iterator != vecPersonInfo.end(); iterator++) {
file<<*iterator;
}
Run Code Online (Sandbox Code Playgroud)
能否请您建议,我如何为这个复杂的对象或一个能够清楚解释它的好教程做到这一点?