txt文件内的多个数字排序, fprintf, fscanf,

这篇博客展示了如何使用C语言读取txt文件中的数字,对其进行排序,然后将排序后的数字重新写回文件。主要涉及了fopen、fprintf、fscanf和文件操作的相关函数,以及冒泡排序算法的应用。
摘要由CSDN通过智能技术生成

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define MAX 500
void write_file()
{
    int index = 0, num = 0;
    FILE *fp;
    char buf[1024];
    fp = fopen("1.txt","w");
    if(NULL == fp
    {
        perror("write_file fopen");
        return;
    }
    srand((unsigned int) time(NULL));
    for(index = 0; index < MAX; index++)
    {
        num = rand()%100;
        fprintf(fp,"%d\n",num); //fprintf一个函数就够了, 相当于sprintf和fputs结合使用。
        //sprintf(buf,"%d\n",num); 
        //fputs(buf,fp);        
    }    
    fclose(fp);
}

void read_file()
{
    int index = 0, num = 0, a[1024],n = 0, i = 0, j = 0;
    FILE *fp;
    char buf[1024];
    fp

下面是一个基于C语言实现的外存文件排序的示例代码: ```c #include <stdio.h> #include <stdlib.h> #define BUF_SIZE 1000000 // 缓冲区大小 #define MAX_SIZE 10000000 // 文件最大大小 // 定义缓冲区结构体 typedef struct { int *data; int size; } Buffer; // 读取文件到缓冲区 Buffer *read_file(FILE *fp) { Buffer *buf = (Buffer *)malloc(sizeof(Buffer)); buf->data = (int *)malloc(BUF_SIZE * sizeof(int)); buf->size = 0; while (!feof(fp) && buf->size < BUF_SIZE) { fscanf(fp, "%d", &(buf->data[buf->size])); buf->size++; } return buf; } // 将缓冲区写入文件 void write_file(FILE *fp, Buffer *buf) { int i; for (i = 0; i < buf->size; i++) { fprintf(fp, "%d ", buf->data[i]); } } // 归并排序 void merge_sort(FILE *fp1, FILE *fp2, int n) { int i, j, k; for (i = 0; i < n; i++) { // 读取两个文件到缓冲区 Buffer *buf1 = read_file(fp1); Buffer *buf2 = read_file(fp2); // 将两个缓冲区进行归并排序 int *tmp = (int *)malloc((buf1->size + buf2->size) * sizeof(int)); j = k = 0; while (j < buf1->size && k < buf2->size) { if (buf1->data[j] < buf2->data[k]) { tmp[j + k] = buf1->data[j]; j++; } else { tmp[j + k] = buf2->data[k]; k++; } } while (j < buf1->size) { tmp[j + k] = buf1->data[j]; j++; } while (k < buf2->size) { tmp[j + k] = buf2->data[k]; k++; } // 将缓冲区写入新文件 FILE *fp = fopen("tmp.dat", "w"); for (j = 0; j < buf1->size + buf2->size; j++) { fprintf(fp, "%d ", tmp[j]); } fclose(fp); // 释放内存 free(buf1->data); free(buf1); free(buf2->data); free(buf2); free(tmp); // 将新文件重命名为原文件 char name[20]; sprintf(name, "%d.dat", i); remove(name); rename("tmp.dat", name); } } // 外排序 void external_sort(char *filename) { int i, n, num_files; FILE *fp = fopen(filename, "r"); // 计算文件个数 fseek(fp, 0L, SEEK_END); long size = ftell(fp); rewind(fp); num_files = size / MAX_SIZE + 1; // 将大文件分割为小文件 for (i = 0; i < num_files; i++) { char name[20]; sprintf(name, "%d.dat", i); FILE *fp1 = fopen(name, "w"); Buffer *buf = read_file(fp); write_file(fp1, buf); fclose(fp1); free(buf->data); free(buf); } fclose(fp); // 对小文件进行内排序和归并排序 for (n = 1; n < num_files; n *= 2) { for (i = 0; i < num_files - n; i += 2 * n) { char name1[20], name2[20]; sprintf(name1, "%d.dat", i); sprintf(name2, "%d.dat", i + n); FILE *fp1 = fopen(name1, "r"); FILE *fp2 = fopen(name2, "r"); merge_sort(fp1, fp2, n); fclose(fp1); fclose(fp2); } } // 将最终结果写入文件 FILE *fp3 = fopen("result.dat", "w"); for (i = 0; i < num_files; i++) { char name[20]; sprintf(name, "%d.dat", i); FILE *fp1 = fopen(name, "r"); Buffer *buf = read_file(fp1); write_file(fp3, buf); fclose(fp1); free(buf->data); free(buf); } fclose(fp3); } // 测试程序 int main() { external_sort("data.dat"); return 0; } ``` 该示例代码实现了一个外排序算法,首先将大文件分割为多个文件,然后对每个小文件进行内排序和归并排序,最终将所有小文件合并为一个有序的大文件。在归并排序过程中,使用了缓冲区来读取和写入数据,以提高排序效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值