//Marchis Bogdan Cristian 311CA
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *ff, *f1, *f2;
char *fisier;
unsigned long nr1, nr2, a1, a2;
int ok, nr_monotonii;
fisier = malloc (50 * sizeof (char));
while (nr_monotonii != 1)
/*din acest while se iese abia cand in fisierul initial mai exista o
* singura monotonie */
{
nr_monotonii = 1;
nr2 = 0;
fisier = "f1";
ff = fopen (argv[1], "rb");
f1 = fopen ("f1", "wb");
f2 = fopen ("f2", "wb");
while (fread (&nr1, sizeof (unsigned long), 1, ff) > 0)
/*in acest while se imparte fisierul in mai multe monotonii in
* fisierele auxiliare f1 si f2 */
{
if (nr1 >= nr2 && strcmp (fisier, "f1") == 0)
{
fwrite (&nr1, sizeof (unsigned long), 1, f1);
nr2 = nr1;
continue;
}
if (nr1 >= nr2 && strcmp (fisier, "f2") == 0)
{
fwrite (&nr1, sizeof (unsigned long), 1, f2);
nr2 = nr1;
continue;
}
if (nr1 < nr2 && strcmp (fisier, "f1") == 0)
{
fwrite (&nr1, sizeof (unsigned long), 1, f2);
fisier = "f2";
nr_monotonii++;
nr2 = nr1;
continue;
}
if(nr1 < nr2 && strcmp (fisier, "f2") == 0)
{
fwrite (&nr1, sizeof (unsigned long), 1, f1);
fisier = "f1";
nr_monotonii++;
nr2 = nr1;
continue;
}
}
/*se citesc in primul rand cate 2 consecutive din fisier pentru
* a putea verifica sfarsitul unei monotonii. Daca numarul la
* care ne afla in fisier este mai mare decat numarul precedent
* se continua monotonia din fisierul f1 sau f2 in care ne
* aflam, iar in caz contrar se incepe o monotonie noua si
* celalalt fisier*/
if(nr_monotonii > 1)
/*daca exista mai mult de o monotonie in fisierul initial se
* vor interclasa monotoniile din cele 2 fisiere auxiliare*/
/* la fiecare moment vor exista cate doua numere consecutive
* citite din fiecare fisier auxiliar. nr1 si nr2 vor ultimele
* numere citite iar a1 si a2 vor fi numerele precedente. Cu
* aceste numere se poate determina sfarsitul unei monotonii
* dintr-un fisier auxiliar*/
{
fclose (ff);
fclose (f1);
fclose (f2);
ff = fopen (argv[1], "wb");
f1 = fopen ("f1", "rb");
f2 = fopen ("f2", "rb");
fread (&nr1, sizeof (unsigned long), 1, f1);
fread (&nr2, sizeof (unsigned long), 1, f2);
a1 = 0;
a2 = 0;
ok = 5;
while (ok != 0)
{
if (ok == 1)
{
fwrite (&nr2, sizeof (unsigned
long), 1, ff);
if (fread (&nr2, sizeof (unsigned
long) , 1, f2) == 0)
{
ok = 0;
}
continue;
}
/* cu aceasta conditie se verifica daca s-a ajuns la
* finalul fisierului 1 auxiliar. Daca s-a ajuns se va
* scrie doar din fisierul 2*/
if (ok == 2)
{
fwrite (&nr1, sizeof (unsigned
long), 1, ff);
if (fread (&nr1, sizeof (unsigned
long), 1, f1) == 0)
{
ok = 0;
}
continue;
}
/*cu aceasta conditie se verifica daca s-a ajuns la
* finalul fisierului 2 auxiliar. Daca s-a ajuns se va
* scrie doar din fisierul 1*/
if (nr1 < a1)
{
while (nr2 >= a2)
{
fwrite (&nr2, sizeof (unsigned
long), 1, ff);
a2 = nr2;
if (fread (&nr2, sizeof (unsigned
long), 1, f2) == 0)
{
ok = 2;
break;
}
}
a1 = 0;
a2 = 0;
}
/*daca ne aflam la finalul unei monotonii in f1 vom
* copia din f2 in ff pana ajungem la finalul unei
* monotonii si in f2*/
if (nr2 < a2)
{
while (nr1 >= a2)
{
fwrite (&nr1, sizeof (unsigned
long), 1, ff);
a1 = nr1;
if (fread(&nr1, sizeof(unsigned
long), 1, f1) == 0)
{
ok = 1;
break;
}
}
a1 = 0;
a2 = 0;
}
/*daca ne aflam la finalul unei monotonii in f2 vom
* copia din f1 in ff pana ajungem la finalul
* monotoniei curente*/
if (nr1 >= nr2 && nr2 >= a2)
{
fwrite (&nr2, sizeof (unsigned
long), 1, ff);
a2 = nr2;
if (fread (&nr2, sizeof (unsigned
long), 1, f2) == 0)
{
ok = 2;
}
continue;
}
if (nr2 > nr1 && nr1 >= a1)
{
fwrite (&nr1, sizeof (unsigned
long), 1, ff);
a1 = nr1;
if (fread (&nr1, sizeof (unsigned
long), 1, f1) == 0)
{
ok = 1;
}
continue;
}
/* daca nu suntem la finalul unei monotonii se va cauta
* cel mai mic numar curent dintre nr1 si nr2 si acela
* se va pune in ff*/
}
}
fclose (ff);
fclose (f1);
fclose (f2);
}
f1 = fopen (argv[1], "rb");
f2 = fopen (argv[2], "wb");
while (fread (&nr1, sizeof (unsigned long), 1, f1))
{
fwrite (&nr1, sizeof (unsigned long), 1, f2);
}
/* se copiaza din fisierul initial in fisierul final*/
fclose (f1);
fclose (f2);
return 0;
}