如何在C语言中将各排序算法结果分别输出到g1、g2、g3文件
C语言排序结果写入文件 + 未知数组大小遍历解决方案
一、将排序结果写入对应文件
把控制台输出改成文件输出很简单,核心是用fopen()打开目标文件,用fprintf()替代printf()输出到文件,最后记得关闭文件避免资源泄漏。
代码示例(整合排序与文件写入)
#include <stdio.h> #include <stdlib.h> // 选择排序 void selectionSort(int arr[], int n) { for (int i = 0; i < n-1; i++) { int minIdx = i; for (int j = i+1; j < n; j++) { if (arr[j] < arr[minIdx]) minIdx = j; } int temp = arr[i]; arr[i] = arr[minIdx]; arr[minIdx] = temp; } } // 插入排序 void insertionSort(int arr[], int n) { for (int i = 1; i < n; i++) { int key = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > key) { arr[j+1] = arr[j]; j--; } arr[j+1] = key; } } // 将数组写入文件的工具函数 void writeArrayToFile(int arr[], int n, const char* filename) { FILE* fp = fopen(filename, "w"); if (!fp) { perror("Failed to open file"); exit(EXIT_FAILURE); } for (int i = 0; i < n; i++) { fprintf(fp, "%d ", arr[i]); } fclose(fp); } int main() { // 示例数组,n为数组长度(后续会讲如何获取未知数组的n) int originalArr[] = {5, 2, 9, 1, 5, 6}; int n = sizeof(originalArr) / sizeof(originalArr[0]); // 复制数组避免排序修改原数组 int selSortArr[n], insSortArr[n]; for (int i = 0; i < n; i++) { selSortArr[i] = originalArr[i]; insSortArr[i] = originalArr[i]; } // 执行排序 selectionSort(selSortArr, n); insertionSort(insSortArr, n); // 写入文件:原数组写入g3,选择排序写入g1,插入排序写入g2 writeArrayToFile(originalArr, n, "g3"); writeArrayToFile(selSortArr, n, "g1"); writeArrayToFile(insSortArr, n, "g2"); return 0; }
二、未知数组大小的遍历解决方案
C语言的数组本身不存储长度信息,必须通过额外记录长度或哨兵值实现遍历,以下是两种最实用的方案:
方案1:手动记录数组长度(推荐)
不管是从文件读取数据、动态分配数组还是用户输入,在创建数组的同时,把元素个数存在一个变量(比如n)里,遍历的时候直接用这个变量作为循环终止条件。
比如从文件读取数据时记录长度:
// 从data.txt读取整数到动态数组 FILE* fp = fopen("data.txt", "r"); if (!fp) { perror("Open failed"); exit(1); } int n = 0; int temp; // 先计数总元素数 while (fscanf(fp, "%d", &temp) == 1) n++; rewind(fp); // 回到文件开头 // 分配动态数组 int* arr = malloc(n * sizeof(int)); for (int i = 0; i < n; i++) { fscanf(fp, "%d", &arr[i]); } fclose(fp); // 遍历数组用n作为长度 for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } free(arr);
方案2:使用哨兵值(仅适用于特定场景)
如果数组元素有明确的取值范围,可以用一个不可能出现在数据中的值作为数组的结尾标记(比如整数数组用INT_MAX,或约定-1为结束),遍历到哨兵值就停止。
示例:
// 假设数组以-1结尾(数据中不会出现-1) int arr[] = {3, 1, 4, 1, 5, -1}; int i = 0; while (arr[i] != -1) { printf("%d ", arr[i]); i++; }
注意:哨兵值方案局限性大,一旦数据中出现哨兵值就会出错,优先用记录长度的方案。
内容的提问来源于stack exchange,提问作者KhuShHh
相关产品推荐
相关产品推荐

