问题描述
我正在尝试将.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;
// ...