/*
        Datoteke txt i bin, upis i citanje niza integera:

    Upis niza integer-a u txt datoteku,
    Citanje niza integer-a iz txt datoteke.

    Upis niza integer-a u bin datoteku,
    Citanje niza integer-a iz bin datoteke.
*/

#include <stdio.h>
#include<stdlib.h>      // zbog exit()


// prikazuje opis niza i niz[] od n clanova
void prikazi_niz(char tekst[],int niz[],int n)
{
    int i;

    printf("\n\n %s",tekst);
    for(i=0;i<n;i++){
        printf(" %d",niz[i]);
    }
    printf("\n");
}


// U txt datoteku ImeDatoteke upisuje niz[] od n integera
void upisi_niz_u_txt_datoteku(char ImeDatoteke[],int niz[],int n)
{
    FILE *p_fajl;
    int i;

    p_fajl = fopen(ImeDatoteke, "w");   // otvaramo txt fajl za pisanje

    if( p_fajl == NULL ) {  // obrada eventualne greske pri otvaranju fajla
        printf("\n Greska pri otvaranju ulaznog fajla ! \n");
        exit(1);            // napustamo program
    }

    // upisujemo jedan po jedan clan niza (integer) u txt datoteku
    for(i=0;i<n;i++){
//        printf("\n Upisujem u txt datoteku niz[%d] = %d",i,niz[i]);
        fprintf(p_fajl,"%d ",niz[i]);
    }

    fclose(p_fajl);     // zatvaramo txt fajl
}


// Iz txt datoteke ImeDatoteke ucitava niz[] od n integera
void ucitaj_niz_iz_txt_datoteke(char ImeDatoteke[],int niz[],int n)
{
    FILE *p_fajl;
    int i;

    p_fajl = fopen(ImeDatoteke, "r");   // otvaramo txt fajl za citanje

    if( p_fajl == NULL ) {  // obrada eventualne greske pri otvaranju fajla
        printf("\n Greska pri otvaranju ulaznog fajla ! \n");
        exit(1);
    }

    // ucitavamo jedan po jedan clan niza (integer) iz txt datoteke u niz[]
    for(i=0;i<n;i++){
        fscanf(p_fajl,"%d ",&niz[i]);    // mora biti isti format kao pri upisu
        //printf("\n Ucitan iz txt datoteke niz[%d] = %d",i,niz[i]);
    }

    fclose(p_fajl);     // zatvaramo txt fajl
}


// U bin datoteku ImeDatoteke upisuje niz[] od n integera
void upisi_niz_u_bin_datoteku(char ImeDatoteke[],int niz[],int n)
{
    FILE *p_fajl;
    int i=0;    // = 0 je obavezno !!!

    p_fajl = fopen(ImeDatoteke, "wb");  // otvaramo bin fajl za pisanje

    if( p_fajl == NULL ) {  // obrada eventualne greske pri otvaranju fajla
        printf("\n Greska pri otvaranju ulaznog fajla ! \n");
        exit(1);
    }
/*
    // upisujemo jedan po jedan clan niza (integer) u bin datoteku
    for(i=0;i<n;i++){
        //printf("\n Upisujem u bin datoteku niz[%d] = %d",i,niz[i]);
        fwrite(&niz[i], sizeof(niz[i]), 1, p_fajl);
    }
*/
    // odjednom upisujemo ceo niz od n integera u bin datoteku
    fwrite(&niz[i], sizeof(niz[i]), n, p_fajl);

    fclose(p_fajl);     // zatvaramo bin fajl
}


// Iz bin datoteke ImeDatoteke ucitava niz[] od n integera
void ucitaj_niz_iz_bin_datoteke(char ImeDatoteke[],int niz[],int n)
{
    FILE *p_fajl;
    int i=0;    // mora zbog while petlje

    p_fajl = fopen(ImeDatoteke, "rb");  // otvaramo bin fajl za citanje

    if( p_fajl == NULL ) {  // obrada eventualne greske pri otvaranju fajla
        printf("\n Greska pri otvaranju ulaznog fajla ! \n");
        exit(1);
    }
/*
    Funkciju feof() ne treba pozivati pre pokusaja citanja  !!!  VAZNO  !!!
    Sledeci kod moze dovesti do greske (ucitava 1 clan niza vise od n):

    while (!feof(p_fajl))
        fscanf(p_fajl,"%d",&br);
*/
/*
    // TREBA OVAKO:
    // Ucitavamo jedan po jedan clan niza (integer) iz bin datoteke
    while(1) {              // beskonacna petlja koja se prekida sa break

        fread(&niz[i],sizeof(niz[i]),1,p_fajl); // pokusavamo da procitamo jedan broj
        //printf("\n Procitano iz bin datoteke niz[%d] = %d",i,niz[i]);

        if (feof(p_fajl))   // Ukoliko smo dosli do kraja datoteke, prekidamo
            break;          // beskonacnu while(1) petlju

        i++;                // idemo na sledeci clan niza
    }
*/
/*
    // ucitavamo jedan po jedan clan niza (integer) u bin datoteku
    for(i=0;i<n;i++){       // sa for petljom dobro radi jer ucitava n integera
        fread(&niz[i],sizeof(int),1,p_fajl);
        //printf("\n Procitano iz bin datoteke niz[%d] = %d",i,niz[i]);
    }
*/
    // odjednom ucitavamo iz bin datoteke n integera u niz
    fread(niz,sizeof(niz),n,p_fajl);

    fclose(p_fajl);         // zatvaramo bin fajl
}




int main(void)
{
    int Niz1[100] = {1,2,3,4};  // Niz integer-a
    int Niz2[100] = {5,6,7,8};
    int n1 = 4;                 // broj clanova niza
    int n2 = 4;

// Tekstualna datoteka:

    // Niz integer-a upisujemo u txt datoteku
    upisi_niz_u_txt_datoteku("Niz1.txt",Niz1,n1);
    upisi_niz_u_txt_datoteku("Niz2.txt",Niz2,n2);

    // Niz integer-a ucitavamo iz txt datoteke
    ucitaj_niz_iz_txt_datoteke("Niz1.txt",Niz1,n1);
    ucitaj_niz_iz_txt_datoteke("Niz2.txt",Niz2,n2);

    // Prikazujemo niz
    prikazi_niz("Niz1 iz txt datoteke je: ",Niz1,n1);
    prikazi_niz("Niz2 iz txt datoteke je: ",Niz2,n2);

    printf("\n\n\n");

// Binarna datoteka:

    // Niz integer-a upisujemo u bin datoteku
    upisi_niz_u_bin_datoteku("Niz1.bin",Niz1,n1);
    upisi_niz_u_bin_datoteku("Niz2.bin",Niz2,n2);

    // Niz integer-a ucitavamo iz bin datoteke
    ucitaj_niz_iz_bin_datoteke("Niz1.bin",Niz1,n1);
    ucitaj_niz_iz_bin_datoteke("Niz2.bin",Niz2,n2);

    // Prikazujemo niz
    prikazi_niz("Niz1 iz bin datoteke je: ",Niz1,n1);
    prikazi_niz("Niz2 iz bin datoteke je: ",Niz2,n2);

/*
    // brisanje datoteka
    remove("Niz1.txt");
    remove("Niz2.txt");
    remove("Niz1.bin");
    remove("Niz2.bin");
*/

    printf("\n\n\n");
    system("PAUSE");
    return 0;
}