2012-10-14 5 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 파일을 만들 수 있지만 그렇지 않은 경우는 작동하지 않고 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는 입력 파일이며이 파일 탭 []이 채워지면 heap_sort를 만들고 결과는 wyjscie.dat에 복사됩니다 – henio180

+0

누가 입력 값을 제공하겠습니까? a) 런타임 동안 프로그램 자체. b) 사용자가 프로그램을 실행하기 전에 입력 파일을 업데이트합니다. – SparKot