You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:22:54