如何读取文件并存储为二维数组?实现图着色程序读取邻接矩阵文件
读取文件并将其存储为二维数组(邻接矩阵),同时改造Color.cpp实现自动读取
没问题,我来帮你搞定这个需求——不管是通用的文件转二维数组的思路,还是针对你的Color.cpp的具体改造方案,下面一步步给你讲清楚:
1. 通用的文件读取转二维数组(Matrix)的核心思路
要把文本文件转成二维数组,关键是和文件格式匹配,先明确你的AdjacencyMatrix.cpp输出的文本是什么样的(比如每行对应矩阵一行,元素用空格/逗号分隔),然后按以下步骤来:
- 打开目标文件,检查是否能正常读取
- 逐行读取文件内容,把每行的元素拆分出来,存入数组的一行
- 验证矩阵的合法性(比如是否是方阵,因为邻接矩阵必须是方阵)
2. 针对Color.cpp的具体改造方案
因为你的Color.cpp原本是硬编码邻接矩阵,现在要替换成从文件读取,这里给你两种常见的C++实现方式(灵活的vector和传统的静态数组):
方式一:使用vector(推荐,无需提前知道顶点数V)
这种方式不需要预先知道顶点数量,会自动根据文件内容生成矩阵:
首先在Color.cpp里添加读取函数,并替换原来的硬编码部分:
#include <iostream> #include <fstream> #include <vector> #include <sstream> #include <cerrno> using namespace std; // 从文件读取邻接矩阵,返回二维vector vector<vector<int>> readAdjacencyMatrix(const string& filename) { ifstream file(filename); if (!file.is_open()) { cerr << "Error: 无法打开文件 " << filename << " - " << strerror(errno) << endl; exit(EXIT_FAILURE); } vector<vector<int>> matrix; string line; int num; // 逐行读取文件 while (getline(file, line)) { vector<int> row; istringstream lineStream(line); // 拆分每行的数字 while (lineStream >> num) { row.push_back(num); } if (!row.empty()) { matrix.push_back(row); } } file.close(); // 检查是否是方阵(邻接矩阵必须是方阵) for (const auto& row : matrix) { if (row.size() != matrix.size()) { cerr << "Error: 读取的邻接矩阵不是方阵!" << endl; exit(EXIT_FAILURE); } } return matrix; } int main() { // 替换原来的硬编码graph[V][V] vector<vector<int>> graph = readAdjacencyMatrix("adjacency_matrix.txt"); int V = graph.size(); // 自动获取顶点数量 // 这里放你原来的图着色逻辑,比如调用你的着色函数 // graphColoring(graph, V); return 0; }
方式二:使用静态数组(适合习惯传统数组的场景)
如果你的代码依赖静态数组,那可以先读取顶点数V(假设文件第一行是V),再创建数组:
#include <iostream> #include <fstream> #include <cerrno> using namespace std; // 读取邻接矩阵到静态数组,同时返回顶点数V int** readAdjacencyMatrixStatic(const string& filename, int& V) { ifstream file(filename); if (!file.is_open()) { cerr << "Error: 无法打开文件 " << filename << " - " << strerror(errno) << endl; exit(EXIT_FAILURE); } // 先读取第一行的顶点数V file >> V; // 创建二维数组 int** matrix = new int*[V]; for (int i = 0; i < V; i++) { matrix[i] = new int[V]; // 读取每行的V个元素 for (int j = 0; j < V; j++) { file >> matrix[i][j]; } } file.close(); return matrix; } int main() { int V; int** graph = readAdjacencyMatrixStatic("adjacency_matrix.txt", V); // 执行你的图着色逻辑 // graphColoring(graph, V); // 记得释放内存,避免内存泄漏 for (int i = 0; i < V; i++) { delete[] graph[i]; } delete[] graph; return 0; }
关键注意事项
- 文件格式匹配:确保AdjacencyMatrix.cpp输出的文件格式和读取逻辑一致。比如如果你的输出是逗号分隔(比如
0,1,0),那需要把拆分逻辑改成处理逗号,比如在读取前把line里的逗号替换成空格,或者用getline按逗号分割。 - 错误处理:代码里已经加了文件打开失败、非方阵的检查,你可以根据自己的需求补充更多异常情况(比如文件内容不是数字)。
- 路径问题:如果
adjacency_matrix.txt不在Color.cpp的运行目录下,要写完整路径(比如"/home/xxx/adjacency_matrix.txt")。
内容的提问来源于stack exchange,提问作者Gene
相关产品推荐
相关产品推荐

