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

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();
}

关键修改说明

  1. 主动处理第21个值:用临时变量(或数组)读取每行最后一个求和值,避免它被读到下一行的数组中
  2. 正确跳过换行符:使用numeric_limits<streamsize>::max()确保跳过当前行所有剩余字符(包括换行符),比固定长度的ignore更可靠
  3. 增加文件打开检查:提前拦截文件不存在或无法打开的情况,避免未知错误

如果需要实现求和对比功能,可添加以下函数:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:25:22