使用 reinterpret_cast 存储结构对象数据时字符数组长度不正确

Incorrect char array length when using reinterpret_cast to store data with struct object

我正在尝试将 .txt 数据(用空格格式化)读入结构对象。为了简化问题,假设 .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 

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

谢谢!

由于您的 char 数组不是空终止的,因此您必须显示每个字符而不是(已衰减的)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;
// ...