2012-10-14 29 views
0

我有一個問題,將結果保存到文件。這是我的代碼:堆排序保存結果文件

#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。請幫幫我。

+0

在使用返回值之前,請檢查'fopen()'是否成功;如果失敗,你可能會崩潰,但即使你不這樣做,它仍然是未定義的行爲。 –

回答

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"); 
+0

是的,但我必須使用文件wejscie.dat和wyjscie.dat – henio180

+0

是的,我知道。 wejscie.dat是一個輸入文件,用這個文件標籤[]填充,然後make heap_sort,最後結果複製到wyjscie.dat – henio180

+0

然後誰應該提供輸入值? a)運行期間程序本身。 b)用戶在運行程序之前更新輸入文件。 – SparKot