C语言如何实现读取输入文件排序后将结果打印到输出文件
C语言实现文件读写复用现有排序逻辑方案
你不需要修改已经验证可正常运行的排序核心代码,只需要替换原来硬编码的数据填充、屏幕打印两个环节的逻辑,接入标准C的文件IO接口即可,整体流程分4步:
第一步:解耦现有代码逻辑
先把你现有硬编码版本的代码拆成三个独立部分,不要揉在一起写:- 待排序数据存储区(比如整数数组、自定义结构体数组)
- 排序函数(输入参数为数组指针、元素个数,内部完成排序逻辑)
- 结果输出逻辑
其中排序函数部分完全保留,不需要做任何修改。
第二步:从输入文件读取待排序数据
引入<stdio.h>头文件,按如下流程读数据:- 用
fopen("输入文件路径", "r")以只读文本模式打开输入文件,判断返回的文件指针是否为NULL,如果打开失败(比如文件不存在、无读权限),直接用perror打印错误信息退出程序即可。 - 根据输入文件的数据格式(空格分隔数字、每行一个数字等),循环调用
fscanf读取数据,依次存入待排序数组,同时累加元素计数变量(就是原来硬编码写死的数组长度值),注意不要超过数组的最大容量避免越界。 - 数据读取完成后,立刻调用
fclose关闭输入文件句柄,避免资源泄漏。
读取空格分隔整数的参考代码片段:
FILE *fin = fopen("input.txt", "r"); if (!fin) { perror("打开输入文件失败"); return 1; } int arr[1024]; // 可根据实际数据量调整大小,或改用动态内存分配 int len = 0; // 循环读取直到文件结束,或达到数组最大容量 while (fscanf(fin, "%d", &arr[len]) == 1 && len < 1024) { len++; } fclose(fin);- 用
第三步:调用原有排序逻辑处理数据
直接传入你从文件中读取到的数组、实际读到的元素个数,调用你原来已经跑通的排序函数即可,这部分代码和硬编码版本完全一致,不需要做任何修改。比如原来写bubble_sort(arr, len);,现在保持原样调用即可。第四步:将排序结果写入输出文件
和读文件逻辑对称,流程如下:- 用
fopen("输出文件路径", "w")以写入文本模式打开输出文件,同样判断文件指针是否为NULL,打开失败则报错退出。 - 循环遍历排好序的数组,用
fprintf按你需要的格式将每个元素写入输出文件,用法和你之前用printf打印到屏幕完全一致,只需要把第一个参数从stdout替换为输出文件指针即可。 - 所有数据写完后,调用
fclose关闭输出文件句柄,确保缓冲区数据全部刷入磁盘。
写入排序结果的参考代码片段:
FILE *fout = fopen("output.txt", "w"); if (!fout) { perror("打开输出文件失败"); return 1; } for (int i = 0; i < len; i++) { // 这里的输出格式可以按需调整,比如改成空格分隔就是"%d " fprintf(fout, "%d\n", arr[i]); } fclose(fout);- 用
常见踩坑提醒
- 不要轻易修改已经验证通过的排序代码:这类改造90%以上的故障都和排序逻辑无关,基本都是读文件时数据解析错误、元素长度计数不对,导致传入排序函数的参数异常。调试时可以先把从文件读到的原始数据打印到屏幕上,和输入文件核对一致后再调用排序函数。
- 如果待排序数据量不确定,不要用固定长度的栈上数组,可以用
malloc申请初始大小的堆内存,读数据时快到容量上限就用realloc扩容,避免数组越界触发段错误。 - 所有文件打开操作必须做返回值校验,不要拿着空指针直接读写导致程序崩溃。
- 写完文件必须调用
fclose,C语言标准库的文件IO带缓冲区,不主动关闭文件的话,缓冲区中滞留的数据可能不会写入磁盘,导致输出文件内容缺失。
内容的提问来源于stack exchange,提问作者extra
相关产品推荐
相关产品推荐

