我有一个看起来像这样的ASCII文件(该文件很大,因此仅粘贴部分内容):
ffffffffffffffff0064000a000a000c
02000000000000000b0000111f0a0503
00000000000002000000000000000000
00000000000000000000000000000000
02000000000000000000020400000000
00000000000000000000000000000000
00000000000000000000000000000000
ffffffffffffffffffffffff00000000
ffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffff
我有一个看起来像这样的结构:typedef struct frame {
uint16_t kps;
uint16_t num_h_region;
uint16_t num_v_region;
uint16_t num_r;
uint8_t reserved1[7];
uint8_t kp_per_region[100];
uint8_t reserved[397];
kp_info_t kp_info[2000];
uint32_t desc[2000];
} frame_t;
哪里:typedef struct kp_info {
uint32_t subpixel_idx_x;
uint32_t subpixel_idx_y;
uint32_t orientation;
uint32_t laplacian;
uint8_t scale;
uint8_t minima; // 1 bit
uint8_t dmy1[14];
uint32_t subpixel_match0_x;
uint32_t subpixel_match0_y;
uint32_t subpixel_match1_x;
uint32_t subpixel_match1_y;
uint32_t distance_match0;
uint32_t distance_match1;
uint8_t ambiguous; // 1 bit
uint8_t dmy2[7];
} kp_info_t;
预计输入文件将被分配给frame_t结构成员,如下所示:frame_t fr;
fr.kps = 0x000c;
fr.num_h = 0x000a;
fr.num_v = 0x000a;
fr.num_r = 0x0064;
fr.reserved1[0] = 0xff;
fr.reserved1[1] = 0xff;
fr.reserved1[2] = 0xff;
fr.reserved1[3] = 0xff;
fr.reserved1[4] = 0xff;
fr.reserved1[5] = 0xff;
fr.reserved1[6] = 0xff;
fr.reserved1[7] = 0xff;
fr.kps_per_region[0] = 0x03;
fr.kps_per_region[1] = 0x05;
fr.kps_per_region[2] = 0x0a;
fr.kps_per_region[3] = 0x1f;
fr.kps_per_region[4] = 0x11;
fr.kps_per_region[5] = 0x00;
fr.kps_per_region[6] = 0x00;
fr.kps_per_region[7] = 0x0b;
fr.kps_per_region[8] = 0x00;
fr.kps_per_region[9] = 0x00;
fr.kps_per_region[10] = 0x00;
fr.kps_per_region[11] = 0x00;
fr.kps_per_region[12] = 0x00;
fr.kps_per_region[13] = 0x00;
fr.kps_per_region[14] = 0x00;
fr.kps_per_region[15] = 0x02;
.. so on.
我已经将ASCII文件转换为二进制文件,但是我对如何正确进行分配一无所知。我在排序中苦苦挣扎,在(不同的)结构中还使用了一系列结构。二进制文件如下所示:
00000000: ffff ffff ffff ffff 0064 000a 000a 000c .........d......
00000010: 0200 0000 0000 0000 0b00 0011 1f0a 0503 ................
00000020: 0000 0000 0000 0200 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 0200 0000 0000 0000 0000 0204 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: ffff ffff ffff ffff ffff ffff 0000 0000 ................
00000080: ffff ffff ffff ffff ffff ffff ffff ffff ................
00000090: ffff ffff ffff ffff ffff ffff ffff ffff ................
000000a0: ffff ffff ffff ffff ffff ffff ffff ffff ................
000000b0: ffff ffff ffff ffff ffff ffff ffff ffff ................
000000c0: ffff ffff ffff ffff ffff ffff ffff ffff ................
000000d0: ffff ffff ffff ffff ffff ffff ffff ffff ................
这是我的尝试:union u_frame {
char mem[sizeof(frame_t)];
frame_t fr;
} uf;
void load_text_file(frame_t& f, const std::string& s)
{
std::fstream input;
input.open(s, std::fstream::in | std::fstream::binary);
if(!input.is_open())
{
fprintf(stderr, "\nError opening file\n");
exit(1);
}
std::cout << "Size of frame_t = " << std::hex << sizeof(frame) << std::endl;
std::cout << "File opened successfully\n";
input.read(uf.mem, sizeof(frame_t));
std::cout << "total_kps = " << uf.fr.total_kps
<< "\nnum_h_region = " << uf.fr.num_h_region
<< "\nnum_v_region = " << uf.fr.num_v_region
<< "\nnum_region = " << uf.fr.num_region;
for(size_t i = 0; i < 8; ++i)
std::cout << "\nreserved[" << i << "] = " << std::hex << (std::uint32_t)(uf.fr.reserved1[i]);
// Printing the first 15 kp_per_region
for(size_t i = 0; i < 15; ++i)
{
std::cout << "\nkps_per_region[" << i << "] = " << (std::uint32_t)(uf.fr.kp_per_region[i]);
}
}
int main() {
frame_t left;
std::cout << "Loading left frame -- \n";
load_text_file(left, "line_ddr.bin");
return 0;
}
这是输出:Loading left frame --
Size of frame_t = 119600
File opened successfully
total_kps = ffff
num_h_region = ffff
num_v_region = ffff
num_region = ffff
reserved[0] = 0
reserved[1] = 64
reserved[2] = 0
reserved[3] = a
reserved[4] = 0
reserved[5] = a
reserved[6] = 0
reserved[7] = c
kps_per_region[0] = c
kps_per_region[1] = 2
kps_per_region[2] = 0
kps_per_region[3] = 0
kps_per_region[4] = 0
kps_per_region[5] = 0
kps_per_region[6] = 0
kps_per_region[7] = 0
kps_per_region[8] = 0
kps_per_region[9] = b
kps_per_region[a] = 0
kps_per_region[b] = 0
kps_per_region[c] = 11
kps_per_region[d] = 1f
kps_per_region[e] = a
请让我知道是否需要其他信息(尤其是因为我仅粘贴了一部分输入文件)。 最佳答案
您的代码完全按照您指定的方式执行。接收input
流并将sizeof(frame_t)
字节加载到uf
中。需要注意的一件事是,您的文件/流是从“左向右”,“逐字节”读取的,因此将从uint16_t
加载到ffff ffff ffff ffff 0064 000a 000a 000c ...
的前两个字节(因为您指定了frame_t.kps
)将是ffff
而不是000c
。进一步研究的好方法是设置一些断点并逐步调试代码。您将学习重要的调试技术,并更多地了解代码的工作方式。
附带一提,我很惊讶您没有stack overflow exception
。该结构是巨大的。
关于c++ - 将文件内容加载到C++结构中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64969536/