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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 14:45:56