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

C语言读取两个文件计算曼哈顿距离的代码实现求助

解决C语言读取双文件计算曼哈顿距离的问题

核心思路

要完成需求,需先完整读取两个文件的点数据并存储,再逐个计算每个点到另一文件所有点的曼哈顿距离,最终找出最小值并输出对应ID与距离。以下是分步实现方案:


1. 定义数据结构

用结构体存储每个点的ID和二维坐标,方便后续数据管理:

typedef struct {
    char id[32];  // 假设ID长度不超过31字符,可按需调整
    int x;
    int y;
} Point;

2. 实现文件读取函数

封装独立的文件读取逻辑,将文件内容解析为点数组并返回点的数量:

int readPointsFromFile(const char* filename, Point** points) {
    FILE* fp = fopen(filename, "r");
    if (!fp) {
        printf("无法打开文件: %s\n", filename);
        return -1;
    }

    int rows, cols;
    // 读取首行的行列数
    if (fscanf(fp, "%d %d", &rows, &cols) != 2) {
        printf("文件格式错误: %s\n", filename);
        fclose(fp);
        return -1;
    }

    // 分配存储点的内存
    *points = (Point*)malloc(sizeof(Point) * rows);
    if (!*points) {
        printf("内存分配失败\n");
        fclose(fp);
        return -1;
    }

    // 跳过首行剩余的换行符,避免干扰后续fgets读取
    fgetc(fp);

    char buffer[1024];
    for (int i = 0; i < rows; i++) {
        if (!fgets(buffer, 1024, fp)) {
            printf("读取文件内容失败: %s\n", filename);
            free(*points);
            fclose(fp);
            return -1;
        }

        // 分割每行数据,提取ID、x坐标、y坐标
        char* token = strtok(buffer, ", ");
        if (token) {
            strncpy((*points)[i].id, token, sizeof((*points)[i].id)-1);
            (*points)[i].id[sizeof((*points)[i].id)-1] = '\0';
        }

        token = strtok(NULL, ", ");
        if (token) (*points)[i].x = atoi(token);

        token = strtok(NULL, ", ");
        if (token) (*points)[i].y = atoi(token);
    }

    fclose(fp);
    return rows;
}

3. 实现曼哈顿距离计算

直接套用曼哈顿距离公式:|x1 - x2| + |y1 - y2|

int manhattanDistance(Point p1, Point p2) {
    return abs(p1.x - p2.x) + abs(p1.y - p2.y);
}

4. 主函数整合逻辑

读取两个文件数据,遍历计算每个点的最近距离并输出:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <math.h>

// 此处插入上述结构体、readPointsFromFile、manhattanDistance函数

int main() {
    Point* testPoints = NULL;
    Point* refPoints = NULL;
    int testCount = readPointsFromFile("Test.txt", &testPoints);
    int refCount = readPointsFromFile("Reference.txt", &refPoints);

    // 检查读取是否成功
    if (testCount == -1 || refCount == -1) {
        free(testPoints);
        free(refPoints);
        return 1;
    }

    // 计算并输出每个Test点的最近参考点距离
    printf("TestID\t最近曼哈顿距离\n");
    for (int i = 0; i < testCount; i++) {
        int minDist = INT_MAX;  // 初始化为整数最大值,确保第一个距离能替换它
        for (int j = 0; j < refCount; j++) {
            int dist = manhattanDistance(testPoints[i], refPoints[j]);
            if (dist < minDist) {
                minDist = dist;
            }
        }
        printf("%s\t%d\n", testPoints[i].id, minDist);
    }

    // 释放动态分配的内存,避免内存泄漏
    free(testPoints);
    free(refPoints);
    return 0;
}

关键细节说明

  • 用结构体存储数据,避免解析后丢失坐标信息,为后续计算提供便利
  • 单独封装文件读取函数,代码结构更清晰,也便于复用
  • 加入多场景错误处理:文件打开失败、格式错误、内存分配失败均有明确提示
  • 使用INT_MAX初始化最小距离,保证第一个计算的距离能覆盖初始值
  • 必须释放动态分配的内存,防止内存泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:41:18