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

C++读取文件合并单元格异常:首字符丢失、size值错误排查

问题分析与解决

问题1:第一行首个单元格首字符'1'被截断的原因

你开头用getchar()读取了文件的第一个字符(也就是第一行的'1'),但这个字符并没有存入数组,后续的cin>>arr[i][0]是从剩下的"5101049"开始读取,自然就丢失了首字符'1'。

问题2:size输出为6而非预期5的原因

你的while((ch = getchar()) != EOF)循环逻辑完全错误:每次循环先读一个字符,然后执行for循环读取一行的4个元素。当文件读到最后一行时,读完最后一行内容后,getchar()会继续读取换行符,此时不等于EOF,会再次进入循环。这时候cin>>arr[i][j]会因为没有数据可读而失败,但代码仍会执行i = i+1,导致i最终变成6。

修正后的代码

把错误的循环逻辑替换为基于cin读取状态的判断,同时正确处理单元格合并:

#include<iostream>
#include<string>
using namespace std;
#define max 20
    
int main()
{
    string arr[max][5];
    int i = 0;
    freopen("input.txt", "r", stdin);

    // 循环读取每行的前4个元素,直到读取失败(到达文件末尾)
    while (cin >> arr[i][0] >> arr[i][1] >> arr[i][2] >> arr[i][3]) {
        // 合并第2、3个单元格到第5个位置
        arr[i][4] = arr[i][1] + arr[i][2];
        i++;
    }

    int size = i;
    cout << "size: " << size << endl;

    for (int k = 0; k < size; k++) {
        cout << arr[k][0] << " " << arr[k][1] << " " << arr[k][2] << " " << arr[k][3] << endl;
    }
    // 可选:打印合并后的第5个单元格内容
    /*
    for (int k = 0; k < size; k++) {
        cout << "合并结果:" << arr[k][4] << endl;
    }
    */

    return 0;
}

补充说明

如果你的输入字段可能包含空格(比如姓名中间有空格),可以改用getline读取整行,再通过stringstream拆分字段,这种方式兼容性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:00:56