请考虑以下代码:
@pragma pack(2)
struct file_data {
uint8_t data0;
uint16_t data1;
uint8_t data2;
}
@pragma pack()
file_data readFile(const std::string& pathFile) {
file_data result;
std::ifstream("FILEPATH", std::ios::in | std::ios::binary);
if(!file.is_open()) return file_data();
file.read(reinterpret_cast<char*>(result), sizeof(file_data));
file.close();
return result;
}
int main(int argc, char* argv[]) {
file_data = readFile("the/path/to/the/file");
return 0;
}
用简单的英语,代码将文件读取到类型为result
的变量file_data
,并返回它。
但是,我已经读取了文件的字节并将其存储在类型为std::vector
的int8_t
中。然后,我想将该数据写入file_data
的实例。我不想逐个字段进行此操作,因为结构可能会更改。
这是我的解决方法:
file_data readData(const std::vector<int8_t>& bytes) {
std::stringstream ss;
for(int8_t byte : bytes) ss.write(reinterpret_cast<const char*>(&byte), sizeof(int8_t));
file_data result;
ss.read(reinterpret_cast<char*>(&result), sizeof(file_data));
return result;
}
因此,首先将向量写回到流中,然后再读入结构中。
我觉得这是非常低效的,这里缺少一些知识。有人可以为我的readData()
方法提供更好的解决方案吗?
此外:int8_t
可能不是char
,应改为使用它。
file_data readData(const std::vector<char>& bytes) {
file_data result;
std::copy_n(bytes.data(), sizeof(file_data), reinterpret_cast<char*>(&result));
return result;
}
[与std::string
和std::array<char, sizeof(file_data)>
的工作原理类似
或以C方式:
file_data readData(const std::vector<char>& bytes) {
file_data *result = (file_data *)bytes.data();
return *result;
}