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

