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

