我想使用C语言的文件输入/输出制作排序程序

时间:2014-08-21 06:00:13

标签: c file sorting file-io mergesort

我想制作'合并排序'计划。 当我开始它时,“arr.txt”和“brr.txt”只是数据而“result.txt”是合并排序的结果(arr.txt + brr.txt)。

#include<stdio.h>
#include<stdlib.h>

void merge_sort(int num)
{

     FILE *fp1,*fp2,*fp3;               // fp1 is arr.txt, fp2 is brr.txt, and fp3 is result.txt

     int i, j, point_one=0, point_two=0;

     char a[num], b[num], c[num];

     fp1=fopen("arr.txt","r");
     fp2=fopen("brr.txt","r");
     fp3=fopen("result.txt","w");

     fscanf(fp1, "%s", a);
     fscanf(fp2, "%s", b);

     for(i=0;i<num;i++)
     {
           if(a[point_one]>b[point_two])
           {
               fprintf(fp3, b[point_two]);
               point_two++;
           }
           else
           {
               fprintf(fp3, a[point_one]);
               point_one++;
           }
     }


     fclose(fp1);
     fclose(fp2);
     fclose(fp3);
}

int main(void)
{

    FILE *fp_one,*fp_two;

    char *arr;

    char *brr;

    int num;

    fp_one=fopen("arr.txt","w");

    fp_two=fopen("brr.txt","w");

    printf("input array size :");
    scanf("%d", &num);

    arr=(char*)malloc(sizeof(char)*num);
    brr=(char*)malloc(sizeof(char)*num);

    printf("input arr :" );
    scanf("%s", arr);
    printf("input brr :");
    scanf("%s", brr);

    fprintf(fp_one, arr);
    fprintf(fp_two, brr);

    merge_sort(num);

    fclose(fp_one);
    fclose(fp_two);
    free(arr);
    free(brr);
    return 0;
}

但是,在这段代码中,我无法进行排序。请帮帮我

++ 如果数组大小为5,则arr.txt的内容为“acfj”,而brr.txt的内容为“bdgh”, result.txt的内容是“abcdfgh”

3 个答案:

答案 0 :(得分:1)

你有两个问题。首先是你不能正确打印字母。 fprintf函数需要第二个参数为字符串,但是传递单个字符。编译器应该向你尖叫警告。你永远不应该忽视警告,因为它们通常是未定义行为的指标。

使用例如fputc或使用正确的格式字符串打印字符。


第二个问题是,你没有足够的时间循环来完成排序/合并,也不会检查任何一个输入的结束。

答案 1 :(得分:0)

在致电fp_one之前,您应关闭fp_twomerge_sort()。否则,之前的输出可能还没有被刷新到文件中。

根据您的测试输入,您尝试将5个字符存储到3元素字符数组中(不要忘记终止字符串的'\0'字符)。这会导致缓冲区溢出,从而导致不确定的行为。

另一个问题:在merge_sort()中,当point_onepoint_two到达字符串的结尾时,下一个比较总是选择'\0',它小于所有其他字符

答案 2 :(得分:0)

在主体上   改为

fprintf(fp_one, "%s", arr);//to prevent malfunction when '%' is included
fprintf(fp_two, "%s", brr);
fclose(fp_one);//to determine the output of the file.
fclose(fp_two);//Also Close to open the file in the merge_sort function.

merge_sort(num);

merge_sort更改为

void merge_sort(int num){

    FILE *fp1,*fp2,*fp3;
    int point_one=0, point_two=0;
    char a[num], b[num];

    fp1=fopen("arr.txt","r");
    fp2=fopen("brr.txt","r");
    fp3=fopen("result.txt","w");

    fscanf(fp1, "%s", a);
    fscanf(fp2, "%s", b);
    fclose(fp1);
    fclose(fp2);
    while(a[point_one] && b[point_two]){//Data of both is valid
        if(a[point_one]>b[point_two]){
            fprintf(fp3, "%c", b[point_two++]);
        } else {
            fprintf(fp3, "%c", a[point_one++]);
        }
    }
    if(a[point_one]){//There is a rest.
        fprintf(fp3, "%s", &a[point_one]);
    }
    if(b[point_two]){
        fprintf(fp3, "%s", &b[point_two]);
    }

    fclose(fp3);
}