C++读取文本表格到二维数组时跳过指定列的问题
问题:C++读取文本文件到二维数组时跳过每行最后一列并正确换行
需求说明
- 目标文件共125行,每行包含21个整数:前20个为业务数据,最后1个是该行数据的求和值
- 需要将数据读取为125行×20列的二维数组,跳过每行的最后一个求和值
- 仅允许使用C++基础语法(函数、数组、循环),不能使用
vector或字符串操作 - 后续需对数组每行数据求和,与文件中的行尾求和值做对比
文件格式示例
1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 93 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 93 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 93 ...
现有代码
常量定义
const int ROWS = 125; const int COLS = 20;
读取函数
void readArray() { ifstream infile("tableofintegers.txt"); for (int rowcount = 0; rowcount < ROWS; rowcount++) // 行循环 { for (int colcount = 0; colcount < COLS; colcount++) // 列循环 { infile >> twoDArray[rowcount][colcount]; // 读取到数组 } } }
数组打印代码
for (int row = 0; row < ROWS; row++) { for (int col = 0; col < COLS; col++) { cout << setw(5) << dataArray[row][col]; } cout << endl; }
遇到的问题
- 现有代码会把每行第21个求和值读取到下一行的开头,完全忽略换行符的存在
- 尝试添加
infile.ignore(10, '\n')后触发运行时错误,错误信息:C:\path\matrix.exe (process 27316) exited with code -2147483645
- 数据错位问题未解决,下一行依然会读取上一行的求和值
解决方案
核心问题是读取完每行20个数据后,没有主动处理该行剩余的第21个值和换行符,修改后的读取函数如下:
#include <limits> // 需要包含该头文件使用numeric_limits void readArray() { ifstream infile("tableofintegers.txt"); // 检查文件是否成功打开,避免异常 if (!infile.is_open()) { cerr << "无法打开目标文件!" << endl; return; } int row_sums[ROWS]; // 可选:存储文件中的每行求和值,用于后续对比 for (int rowcount = 0; rowcount < ROWS; rowcount++) { // 读取每行前20个数据到二维数组 for (int colcount = 0; colcount < COLS; colcount++) { infile >> twoDArray[rowcount][colcount]; } // 读取并保存(或直接丢弃)每行的第21个求和值 infile >> row_sums[rowcount]; // 跳过当前行剩余的所有字符(包括换行符),确保下一行从新行起始位置读取 infile.ignore(numeric_limits<streamsize>::max(), '\n'); } infile.close(); }
关键修改说明
- 主动处理第21个值:用临时变量(或数组)读取每行最后一个求和值,避免它被读到下一行的数组中
- 正确跳过换行符:使用
numeric_limits<streamsize>::max()确保跳过当前行所有剩余字符(包括换行符),比固定长度的ignore更可靠 - 增加文件打开检查:提前拦截文件不存在或无法打开的情况,避免未知错误
如果需要实现求和对比功能,可添加以下函数:
void checkRowSums() { for (int row = 0; row < ROWS; row++) { int calculated_sum = 0; // 计算当前行数组的求和值 for (int col = 0; col < COLS; col++) { calculated_sum += twoDArray[row][col]; } // 与文件中的求和值对比 if (calculated_sum == row_sums[row]) { cout << "第" << row+1 << "行:求和匹配,值为" << calculated_sum << endl; } else { cout << "第" << row+1 << "行:求和不匹配——计算值" << calculated_sum << ",文件值" << row_sums[row] << endl; } } }
内容的提问来源于stack exchange,提问作者Salome
相关产品推荐
相关产品推荐

