ciao a tutti
ho fatto questo breve programmino sulla gestione di appartamenti.
ma mi da errore di segmentation fault.
qualcuno sa aiutarmi ?
codice:
#include <stdio.h>
#include <stdlib.h>
#define N 10

/* dichiarazione della struttura assegnazione */

struct assegnazione {
        int Numero_appartamento;
        char Nome_Proprietario[20];
        char Cognome_Proprietario[20];
        int Settimana_acquistata;
};


int main()
{


    struct assegnazione ass;
    struct assegnazione v[ N ];
    int fine, app, num, low, high, middle;
    int i, j, k;
    char buffer[20];


    FILE *cfPtr;   /* puntatore al file proprietà.dat */


    if ((cfPtr = fopen("proprietà.dat", "wb") == NULL)) {
        printf("Il file non può essere aperto");
    }
    else {

    while (!fine)
    {
        printf("Numero appartamento : \n");
        scanf("%d", &ass.Numero_appartamento);
        printf("Nome del Proprietario : \n");
        scanf("%s", ass.Nome_Proprietario);
        printf("Cognome del Proprietario : \n");
        scanf("%s", ass.Cognome_Proprietario);
        printf("Settimana acquistata : \n");
        scanf("%s", &ass.Settimana_acquistata);

        /* scriviamo i dati inseriti sul file puntato da cfPtr */
        fwrite(&ass, sizeof(struct assegnazione), 1, cfPtr);
        printf("Fine (SI=1, NO=0) ?");
        scanf("%d", &fine);

    }

    fclose(cfPtr);

    }
    if( (cfPtr = fopen("proprietà.dat", "rb") ) == NULL) {
        printf("Il file non può essere aperto");
    }
    else{


    /* Legge dal file e li memorizza in memoria in v */
        i = 0;

        while(!feof(cfPtr)) {
            fread(&v[i], sizeof( struct assegnazione), 1, cfPtr);
            i++;
        }

        fclose(cfPtr);
    }

    /* Ordinamento crescente con aLgoritmo BUBBLE SORT */

    for ( j = 1; j < i + 1; j++ ) {

        for ( k = 0; k < i; k++ ) {


            if ( v[j].Numero_appartamento > v[k].Numero_appartamento) {

                app = v[k].Numero_appartamento;
                v[k].Numero_appartamento = v[j].Numero_appartamento;
                v[j].Numero_appartamento = app;

                strcpy(buffer, v[k].Nome_Proprietario);
                strcpy(v[k].Nome_Proprietario, v[j].Nome_Proprietario);
                strcpy(v[j].Nome_Proprietario, buffer);

                strcpy(buffer, v[k].Cognome_Proprietario);
                strcpy(v[k].Cognome_Proprietario, v[j].Cognome_Proprietario);
                strcpy(v[j].Cognome_Proprietario, buffer);

                app = v[k].Settimana_acquistata;
                v[k].Settimana_acquistata = v[j].Settimana_acquistata;
                v[j].Settimana_acquistata = app;

            }

        }
    }


    printf("Inserisci numero appartamento da ricercare : \n");
    scanf( "%d", &num );

    low = 0;
    high = i;

    while ( low <= high ) {

        middle = i / 2;

        if ( num == v[middle].Numero_appartamento ) {
            printf("I dati dell'appartamento cercato sono : \n");
            printf("%d\n", v[middle].Numero_appartamento);
            printf("%s\n", v[middle].Nome_Proprietario);
            printf("%s\n", v[middle].Cognome_Proprietario);
            printf("%d\n", v[middle].Settimana_acquistata);
        }
        else if ( num < v[middle].Numero_appartamento ) {
            high = middle - 1;
        }

        else {
            low = middle + 1;
        }
    }

    return 0;

    }