使用reinterpret_cast与struct对象存储数据时,不正确的char数组长度

问题描述

我正在尝试将.txt数据(用空格格式化的 )读取到struct对象中。为了简化问题,假设.txt包含一个学生的名字姓氏校园代码 id的记录

这是结构:

struct Student {
char f_name[10]; // John,followed by 6 spaces
char l_name[20]; // Fuller,followed by 14 spaces
char camp_code; 
char id[8]; // 
} s;

这是我将reinterpret_cast与fstream一起使用的方式:

f.read(reinterpret_cast<char *>(&s),sizeof(s));

它可以编译,但是当我显示(编辑:std::cout<<s.f_name; ...)结果时,结果看起来像这样:

first name: John      Fuller              E23123456 
last name: Fuller              E23123456 
campus code: E
id: 23123456 

似乎编译器已成功找到struct对象的每个组件的起点,但它存储了从该组件开始的整个记录​​。除了camp_code部分,它正确地抓取了char元素。知道我在这里想念的地方吗?

谢谢!

解决方法

由于您的char数组未以nul终止,因此您必须显示每个字符,而不要显示(已腐烂的)const char*

template <std::size_t N>
void print(const char (&a)[N])
{
    for (auto c : a)
        std::cout << c;
}

然后

Student student;
// init student
// ...


print(student.f_name); // instead of std::cout << student.f_name;
print(student.l_name); // instead of std::cout << student.l_name;
std::cout << student.camp_code;
// ...