get函数返回无效值:无法正确读取hourlyPay的技术问题咨询
问题分析与解决方案
看起来你遇到的是字符串读取错位导致数值读取失败的问题,输出里的4.94066e-324是典型的未正确初始化/读取错误的double类型垃圾值,根源出在你读取name字段的方式上。
问题原因
你的name是char[21]类型,要存储包含空格的全名(比如Christine Kim),但如果用普通的cin >> name来读取,cin会把空格作为分隔符,只读取到第一个空格前的Christine,剩下的Kim会被当成下一个字段(也就是hourlyPay)来读取。显然字符串转double会失败,最终hourlyPay得到的是内存里的随机垃圾值。
修复方案
要读取包含空格的字符串,你需要用getline来读取完整的姓名,但要注意处理前面输入留下的换行符/空白字符,否则getline会直接读取空行。以下是修正后的读取逻辑示例:
#include <iostream> #include <iomanip> #include <fstream> #include <cstring> using namespace std; class Employee { private: int id; char name[21]; double hourlyPay; public: // 给类添加读取数据的方法,或者在主函数里正确读取 void readFromFile(ifstream& inFile) { // 先读取id,然后忽略缓冲区里的换行/空格 inFile >> id; inFile.ignore(); // 跳过id后面的换行或空白字符 // 读取完整的姓名(直到换行或达到20个字符,留一个位置存结束符) inFile.getline(name, 21); // 最后读取hourlyPay inFile >> hourlyPay; } void print() { cout << id << " " << name << " " << fixed << setprecision(2) << hourlyPay << endl; } }; int main() { ifstream inFile("employees.txt"); if (!inFile) { cerr << "Failed to open file!" << endl; return 1; } Employee emp; emp.readFromFile(inFile); emp.print(); inFile.close(); return 0; }
额外注意事项
- 用
getline读取char[]时,第二个参数要指定数组大小(这里是21),避免缓冲区溢出。 - 如果你的文件里字段是用空格分隔而非换行,那可以采用另一种处理方式:先读取id,再读取名和姓两个字符串,拼接成完整姓名后再读取
hourlyPay,示例代码如下:
这种方式适合姓名固定是名+姓两个部分的场景。char firstName[11], lastName[11]; inFile >> id >> firstName >> lastName >> hourlyPay; strcpy(name, firstName); strcat(name, " "); strcat(name, lastName);
内容的提问来源于stack exchange,提问作者Shaun Peretz
相关产品推荐
相关产品推荐

