Posto il mio codice (che non gira ma il compilatore non da alcun errore).
Premetto che i file da leggere sono 2 e si deve scrivere in un terzo.
I due file hanno un'intestazione diversa (le due stringhe di cui parlavo in precedenza) poi hanno sempre la stessa struttura ovvero:
intestazione
temp data
temp data

Devo fare la parte terminale dell'algoritmo merge-sort, quindi il sort. Scrivere nel file finale ordinando per data e qualora la data sia uguale scrivo prima il dato con temperatura minore.
So benissimo che non sono un informatico, che non conosco bene l'allocazione dinamica e che ci saranno un'infinità di idiozie... (sebbene il programma diciamo in allocazione statica opportunamente modificato giri).

Neanche a me piace la fscanf ma come fare la sscanf da file? se scrivo sscanf(f, "%s", stringa) il compilatore non accetta come primo argomento di sscanf un puntatore a file...

codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#include <malloc.h>
int main()
{
int risultato_confronto; //variabile per risultato del confronto delle date
int i=0, j=0, k=0, l=0, m=0, cont=0, cont2=0, app1=0, app2=0;      //contatori ausiliari
char nome1[20];
char nome2[20];
char nome3[20];
char nome4[20];
int gg1, mm1, aa1, gg2, mm2, aa2;
struct tipo_dato            //creo struttura per immagazzinare i dati
{
    double temp;
    char data[10];
};
struct tipo_dato *centrale1;    //dichiaro struttura centrale1 per Dati1.txt
struct tipo_dato *centrale2;     //dichiaro struttura centrale2 per Dati2.txt
FILE* f= NULL;      //puntatore al primo file
FILE* f2 = NULL;    //puntatore al secondo file
FILE* f3 = NULL;    //puntatore al terzo file
f=fopen("Dati1.txt","r");
f2=fopen("Dati2.txt","r");
if (f==NULL || f2==NULL)
{
    printf ("Errore nell'apertura dei file di origine.");
}
else
{
    fscanf(f,"%s %s", nome1, nome2);            //leggo nome della 1a centralina dall'intestazione di Dati1.txt
    fscanf(f2,"%s %s", nome3, nome4);           //leggo nome della 2a centralina dall'intestazione di Dati2.txt
    while (!(feof(f)))
    {                       //ciclo while per lettura dati1.txt e immagazzino dati in centrale1 con reallocazione elemento per elemento
        l++;
        centrale1=(struct tipo_dato*)realloc(centrale1,sizeof(struct tipo_dato)*l);
       fscanf(f,"%lf %s", &centrale1[l-1].temp, centrale1[l-1].data);
    }
    fclose(f);
    while (!(feof(f2)))
    {                       //ciclo while per lettura dati2.txt e immagazzino dati in centrale2 con reallocazione elemento per elemento
        m++;
        centrale2=(struct tipo_dato*)realloc(centrale2,sizeof(struct tipo_dato)*m);
        fscanf(f2,"%lf %s", &centrale2[m-1].temp, centrale2[m-1].data);
    }
    fclose(f2);                         //potrei anche usare rewind(f) e rewind(f2)
    f=fopen("Dati1.txt","r");
    f2=fopen("Dati2.txt","r");
    f3=fopen("Dati.txt","w");
    i=0;
    j=0;
        while ((i<l-1)&&(j<m-1))        //conoscendo gia' quanti record hanno i due file: ciclo finche' uno dei due non termina
        {
            sscanf(centrale1[i].data, "%d/%d/%d", &gg1, &mm1, &aa1);        //leggo la data di dati1.txt
            sscanf(centrale2[j].data, "%d/%d/%d", &gg2, &mm2, &aa2);        //leggo la data di dati2.txt
            if ((aa1>aa2)||((aa1==aa2)&&(mm1>mm2))||((aa1==aa2)&&(mm1==mm2)&&(gg1>gg2)))
                risultato_confronto=1;          //se data1>data2
            else
            {
                if ((aa1==aa2)&&(mm1==mm2)&&(gg1==gg2))
                    risultato_confronto=0;          //se date uguali
                else
                    risultato_confronto=-1;         //negli altri casi data1<data2
            }
            if (risultato_confronto==0)     //se data uguale
            {
                if (centrale1[i].temp>=centrale2[j].temp)       //scrivi prima le info del record con temperatura minore
                {
                    fprintf(f3,"%lf %s %s %s\n", centrale2[j].temp, centrale2[j].data, nome3, nome4);
                    j++;        //vai avanti con il prossimo record in dati2.txt
                    k++;
                }
                else            //altrimenti se data uguale e temp1<temp2 stampa le informazioni di dati1.txt
                {
                    fprintf(f3,"%lf %s %s %s\n", centrale1[i].temp, centrale1[i].data, nome1, nome2);
                    i++;          //vai avanti con il prossimo record in dati1.txt
                    k++;
                }
            }
            else
            {
                if (risultato_confronto>0)      //se data1>data2 stampa le informazioni di dati2.txt
                {
                    fprintf(f3,"%lf %s %s %s\n", centrale2[j].temp, centrale2[j].data, nome3, nome4);
                    j++;        //vai avanti con il prossimo record in dati2.txt
                    k++;
                }
                else            //se data1<data2 stampa le informazioni di dati1.txt
                {
                    fprintf(f3,"%lf %s %s %s\n", centrale1[i].temp, centrale1[i].data, nome1, nome2);
                    i++;        //vai avanti con il prossimo record in dati1.txt
                    k++;
                }
            }
        }
        if (i<l-1)      //se uno dei due file e' terminato, stampa i record dell'altro
        {
            app1=l-i;
            for (cont=0;cont<app1-1;cont++)
            {
                fprintf(f3, "%lf %s %s %s\n", centrale1[i].temp, centrale1[i].data, nome1, nome2);
                i++;
                k++;
            }
        }
        if (j<m-1)      //se uno dei due file e' terminato, stampa i record dell'altro
        {
            app2=m-j;
            for (cont2=0;cont2<app2-1;cont2++)
            {
                fprintf(f3, "%lf %s %s %s\n", centrale2[j].temp, centrale2[j].data, nome3, nome4);
                j++;
                k++;
            }
        }
    fclose(f2);
    fclose(f);
    fclose(f3);
}
return 0;
}