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", ¢rale1[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", ¢rale2[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;
}