Рассмотрим следующий код:
#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(pathFile, 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;
}
В простом Engli sh код считывает файл в переменную result
типа struct 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()
метода?