使用 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;
// ...
我正在尝试将 .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;
// ...