C++从文件读取数据存入struct成员,现有写法是否需要用getline
问题解答
1. 现有代码的问题
你当前的写法无法通过编译,更无法完成读取需求:C++默认不会为自定义Person结构体提供流提取运算符>>的处理逻辑,你必须先重载该运算符,才能使用fin >> p1这类语法读取数据到结构体中。
2. 重载运算符后的读取效果
你可以按照如下逻辑重载>>运算符,适配你提供的文件格式:
#include <istream> #include <string> using namespace std; struct Person { string fName; string lName; int age; }; istream& operator>>(istream& is, Person& p) { is >> p.fName >> p.lName >> p.age; return is; }
这种情况下不需要使用getline就能正常读取你的ppl.log内容:
>>运算符默认会自动跳过所有空白分隔符(包括空格、换行符、制表符)- 你的文件每一行刚好是「无空格的名 + 无空格的姓 + 数字」的格式,和
>>按空白分割读取的逻辑完全匹配,可以正确把每行的三个值赋值给结构体的对应字段。
3. 什么时候需要用getline
只有当你需要读取的单个字段本身包含空格时,才需要用到getline,比如你的文件里某行存储的是"Glenallen Mixon" 14(整个姓名是一个字段,中间带空格),这种情况>>运算符会把空格当成字段分隔符,读取结果不符合预期,就需要用getline先读取整行,再手动拆分字段内容。你当前的场景不需要这么做。
内容的提问来源于stack exchange,提问作者vivianhxy
相关产品推荐
相关产品推荐

