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

C++文件读取与格式化问题:仅读最后条目及姓名拆分求助

C++文件读取问题解决方案

问题1:仅读取最后一组数据的修复

原代码的核心问题:

  • 内部for循环完全冗余,每次循环会连续读取3组数据(共9行),但变量会被反复覆盖,最终只保留最后一组的值
  • while(!fs.eof())的判断逻辑有缺陷,文件流的eof标志仅在尝试读取超出文件末尾时才会触发,可能导致最后一次循环读取无效数据

修复方案:

  • 移除内部for循环,直接在while循环中读取一组(3行)数据
  • 将读取操作作为循环条件,确保只有成功读取到完整的一组数据时,才进入循环处理

问题2:拆分姓名为独立变量

姓名行是名和姓用空格分隔的字符串,推荐用istringstream实现拆分,代码简洁且鲁棒性强:

  • 将完整姓名字符串传入istringstream
  • 通过>>运算符自动按空格分割,提取出名和姓两个独立变量

修改后的完整代码

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>

using namespace std;

int main(){
    fstream fs; 
    fs.open("/Users/brah79/Downloads/skola/c++/OOP/uppgift1/personInfo.txt"); 
    string fullName; 
    string firstName, lastName;
    string phone_number; 
    string adress;

    // 以读取三组数据为循环条件,确保读取完整才处理
    while(getline(fs, fullName) && getline(fs, phone_number) && getline(fs, adress)){
        // 拆分姓名为名和姓
        istringstream nameStream(fullName);
        nameStream >> firstName >> lastName;

        // 输出处理后的数据
        cout << "first name: " << firstName << endl; 
        cout << "last name: " << lastName << endl;
        cout << "person nummer: " << phone_number << endl; 
        cout << "adress: " << adress << endl;
        cout << "-------------------------" << endl;
    }
    fs.close(); 
    return 0; 
}

代码说明

  • 循环条件改为同时读取姓名、手机号、地址三行,任意一行读取失败(如到文件末尾)则终止循环,避免无效读取
  • 新增姓氏输出,添加分隔线让每组数据的输出更清晰
  • 用istringstream处理姓名拆分,兼容标准的名+姓空格分隔格式

内容的提问来源于stack exchange,提问作者brah79

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:30:52