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
相关产品推荐
相关产品推荐

