使用选择排序对文本文件整数排序并写入新文件的代码问题求助
问题修复与代码优化
代码中的核心问题
- 排序函数传参错误:调用
selectionSort(fptr, n);时,第一个参数应该是存储数据的数组arr,而非文件指针fptr。原代码错误地将文件指针传给了需要整数数组地址的参数,导致排序逻辑完全没有作用在目标数组上。 - 缺少写入目标文件的逻辑:原代码仅将结果打印到控制台,未实现写入
output.txt的需求。 - 未处理文件打开失败的情况:若
random.txt不存在或无法访问,fopen会返回NULL,后续fscanf操作会引发程序崩溃,需增加错误检查。
修正后的代码
#include <stdio.h> void swap(int *xp, int *yp) { int temp = *xp; *xp = *yp; *yp = temp; } void selectionSort(int *arr, int n) { int i, j, min_idx; for (i = 0; i < n - 1; i++) { min_idx = i; for (j = i + 1; j < n; j++) if (arr[j] < arr[min_idx]) min_idx = j; swap(&arr[min_idx], &arr[i]); } } int main() { int i = 0, n = 0; int arr[100000]; FILE *fptr; // 打开输入文件并检查是否成功 fptr = fopen("random.txt", "r"); if (fptr == NULL) { printf("无法打开输入文件\n"); return 1; } // 读取文件数据到数组 while (fscanf(fptr, "%d", &arr[i]) == 1) { n++; i++; } fclose(fptr); // 读取完成后关闭输入文件 // 调用排序函数,传入正确的数组参数 selectionSort(arr, n); // 打开输出文件并检查是否成功 FILE *out_ptr = fopen("output.txt", "w"); if (out_ptr == NULL) { printf("无法创建输出文件\n"); return 1; } // 将排序结果写入文件,同时打印到控制台 for (i = 0; i < n; i++) { fprintf(out_ptr, "%d ", arr[i]); printf("%d ", arr[i]); } fclose(out_ptr); // 关闭输出文件 return 0; }
修正说明
- 修正
selectionSort的调用参数,传入存储数据的arr数组,确保排序逻辑作用在目标数据上。 - 增加输入/输出文件的打开失败判断,提升程序稳定性。
- 新增写入
output.txt的逻辑,同时保留控制台打印功能,满足需求。 - 读取完文件后及时关闭文件指针,避免资源泄漏。
内容的提问来源于stack exchange,提问作者cereyanci23
相关产品推荐
相关产品推荐

