You need to enable JavaScript to run this app. C++读取txt文件矩阵维度实现矩阵加法时出现报错如何解决
优惠活动
大模型
产品
解决方案
定价
更多

C++读取txt文件矩阵维度实现矩阵加法时出现报错如何解决

代码反复报错的核心原因
  • 最直观的语法错误:你把n、m、p、q声明为const常量并初始化为固定值8,后续又用myfile >> n >> m的逻辑向只读常量写入文件读取的值,编译器会直接抛出“向只读变量赋值”的错误。
  • 换普通int声明后仍报错的根本原因:你写完普通int变量后,直接用它当静态数组的长度写了double matrix1[n][m]这类代码——标准C++不允许用运行时才能确定值的变量作为静态数组的长度。这种变长数组(VLA)是C99标准的特性,仅GCC等部分编译器能兼容,在Visual Studio等严格遵循C++标准的编译环境下会直接报错,和你用const还是普通int声明变量没有关系。
  • 逻辑和需求不匹配:题目要求两个独立的.txt文件分别存储一个矩阵的数据,你从头到尾只打开了一个文件流,没有单独处理第二个矩阵的文件打开、读取流程,就算解决了前面的语法问题,也读不到第二个矩阵的有效数据。
修正方案
  • 删掉代码里完全没用的冗余变量:也就是提前声明的arr[8][8]、arr2[8][8]这两个全程没参与运算的8x8静态数组,去掉对维度变量的const固定值初始化。
  • 用C++标准库的vector替代静态二维数组,动态适配运行时从文件读取到的任意行、列数,从根源上解决数组长度不匹配语法要求的问题。
  • 分别打开两个独立的矩阵文件,每个文件单独读取自身的行列维度、矩阵元素,完全匹配题目的输入规则。
修正后的可运行代码
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <vector>

using namespace std;

int main() {
    // 读取第一个矩阵文件
    string filename1;
    cout << "Enter first matrix file name: ";
    cin >> filename1;
    ifstream file1(filename1);
    if (!file1.is_open()) {
        cout << "Failed to open the first file" << endl;
        return 1;
    }
    // 读取第一个矩阵维度
    int n, m;
    file1 >> n >> m;
    vector<vector<double>> matrix1(n, vector<double>(m));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            file1 >> matrix1[i][j];
        }
    }
    file1.close();
    // 打印第一个矩阵
    cout << "MATRIX 1" << endl;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cout << right << setw(5) << matrix1[i][j];
        }
        cout << endl;
    }
    cout << endl;

    // 读取第二个矩阵文件
    string filename2;
    cout << "Enter second matrix file name: ";
    cin >> filename2;
    ifstream file2(filename2);
    if (!file2.is_open()) {
        cout << "Failed to open the second file" << endl;
        return 1;
    }
    // 读取第二个矩阵维度
    int p, q;
    file2 >> p >> q;
    vector<vector<double>> matrix2(p, vector<double>(q));
    for (int i = 0; i < p; i++) {
        for (int j = 0; j < q; j++) {
            file2 >> matrix2[i][j];
        }
    }
    file2.close();
    // 打印第二个矩阵
    cout << "MATRIX 2" << endl;
    for (int i = 0; i < p; i++) {
        for (int j = 0; j < q; j++) {
            cout << right << setw(5) << matrix2[i][j];
        }
        cout << endl;
    }
    cout << endl;

    // 矩阵加法合法性校验
    if (n == p && m == q) {
        vector<vector<double>> matrix3(n, vector<double>(m));
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                matrix3[i][j] = matrix1[i][j] + matrix2[i][j];
            }
        }
        cout << "ADDITION of MATRIX 1 AND MATRIX 2" << endl;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                cout << right << setw(5) << matrix3[i][j];
            }
            cout << endl;
        }
    } else {
        cout << "Both matrix cannot be added!" << endl;
    }
    return 0;
}

注意:不要为了兼容变长数组语法强行在非标准编译模式下跑代码,vector实现的动态二维数组是C++环境下处理未知维度矩阵的标准写法,兼容性和可维护性远好于硬编码的定长数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 14:15:04