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

如何读取文件并存储为二维数组?实现图着色程序读取邻接矩阵文件

读取文件并将其存储为二维数组(邻接矩阵),同时改造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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:54:42