堆排序将结果保存到文件

时间:2012-10-14 09:57:28

标签: c file heapsort

我将结果保存到文件时遇到问题。这是我的代码:

#include<stdio.h>
#include<stdlib.h>
#define DUZO 100000000
int heap_size;
int tab[DUZO];
FILE* wejscie;
FILE* wyjscie;

void rand1(int tmp){
    int i, y;

    for(i = 0; i < tmp; i++){
        y = rand();
        fprintf(wejscie, "%i ", y);
    }
}

void heapify(int start){
    int l, r, largest, pom;

    l = 2*start + 1;
    r = 2*start + 2;

    if((l < heap_size) && (tab[l] > tab[start]))
        largest = l;
    else
        largest = start;

    if((r <  heap_size) && (tab[r] > tab[largest]))
        largest = r;
    if(largest != start){
        pom = tab[start];
        tab[start] = tab[largest];
        tab[largest] = pom;

        heapify(largest);
    }
}

void build_max(){
    int lenght, i;
    lenght = heap_size;

    for(i = ((lenght - 1)/2); i >= 0; --i){
        heapify(i);
    }
}

void heap_sort(){
    int i;
    build_max();


    for(i = heap_size-1; i > 0; --i) {
        int tmp = tab[0];
        tab[0] = tab[i];
        tab[i] = tmp;
        --heap_size;
        heapify(0);
    }
}

int main(void){

    wejscie=fopen("wejscie.dat","rw");
    wyjscie=fopen("wyjscie.dat","w");

    int i, tmp;

    printf("Podaj ilosc liczb do sortowania: ");
    scanf("%i", &heap_size);
    tmp = heap_size;

    rand1(tmp);

    printf("Pseudolosowe liczby do posortowania: \n");
    for(i = 0; i < tmp; i++){
        fscanf(wejscie,"%i", &tab[i]);
        printf("%i\n", tab[i]);
    }

    heap_sort();

    fclose(wejscie);

    printf("\nPosortowany ciag: \n");
    for(i = 0; i < tmp; i++){
        printf("%i\n", tab[i]);
        fprintf(wyjscie, "%i\n", tab[i]);
    }

    fclose(wyjscie);
return 0;   
}

当我创建文件wejscie.dat程序工作正常,但是当我不使用rand函数创建它时它不起作用并且不将结果保存到文件wejscie.dat。请帮帮我。

1 个答案:

答案 0 :(得分:2)

wejscie.dat 是您的输入文件。显然,您正在将随机值写入其中并再次读取它以加载tab[]。您可以通过在rand1()本身初始化数组来跳过创建文件。

wyjscie.dat 是您的输出文件 wejscie.dat

PS: 以"w+"模式和rewind打开输入文件,然后再次阅读。

    wejscie = fopen("wejscie.dat", "w+");
    if (NULL == wejscie) {
        fprintf( stderr, "ERROR: Opening Input file Err[%d] Error[%s]", errno, strerror(errno));
        //Formal error handling
        return (-1);
    }
    //...
    //...
    rand1(tmp);
    rewind (wejscie); 
    fprintf( stderr, "Pseudolosowe liczby do posortowania: \n");