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

使用选择排序对文本文件整数排序并写入新文件的代码问题求助

问题修复与代码优化

代码中的核心问题

  • 排序函数传参错误:调用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;
}

修正说明

  1. 修正selectionSort的调用参数,传入存储数据的arr数组,确保排序逻辑作用在目标数据上。
  2. 增加输入/输出文件的打开失败判断,提升程序稳定性。
  3. 新增写入output.txt的逻辑,同时保留控制台打印功能,满足需求。
  4. 读取完文件后及时关闭文件指针,避免资源泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 18:12:48