PDA

Visualizza la versione completa : [C++] "Merge" di file


folk3n
14-02-2006, 12:54
ciao a tutti... :ciauz:
dovrei capire come funziona questo programma, ma ci sono 2 passaggi che nn riesco prorpio a capire!!! :dh:
c' qualcuno che pu commentarmeli??? :confused:

il testo del programma :

Prova pratica del 19/1/05
Si abbiano due file di testo, ciascuna riga dei quali abbia il seguente formato:
<matricola> <cognome> <nome>
Ciascuno dei due file ordinato alfabeticamente per cognome e nome.
Redigere un programma C++ che unisca i due file generando un unico file sempre ordinato per
cognome e nome. Si supponga che la lunghezza di ciascun file sia tale da non poter essere letto
interamente in memoria. Il programma deve chiedere lintroduzione dei nomi dei due file di input e
del file di output.

Esempio primo file di input:
100184 BONELLI GIULIO
100303 CARRA VITTORIO
100194 FRANCHI ANGELA
100231 GROSSI GABRIELE

Esempio secondo file di input:
102893 ANGHINOLFI RAFFAELE
100292 FOLLI ALBERTO
103853 GROSSI EGIDIO
103858 MAGNANI GISELLA
103781 NUCCI MASSIMILIANO

File di output:
102893 ANGHINOLFI RAFFAELE
100184 BONELLI GIULIO
100303 CARRA VITTORIO
100292 FOLLI ALBERTO
100194 FRANCHI ANGELA
103853 GROSSI EGIDIO
100231 GROSSI GABRIELE
103858 MAGNANI GISELLA
103781 NUCCI MASSIMILIANO

e il codice :




#include <iostream>
#include <fstream>

using namespace std;


main()
{
// Richiesta dei nomi dei file e controllo
char infile1[20], infile2[20], outfile[20];
cout << "Nome del primo file di input: ";
cin >> infile1;
ifstream fin1(infile1);
if (!fin1) {
cerr << "Errore: impossibile aprire file " << infile1 << "\n";
exit(1);
}
cout << "Nome del secondo file di input: ";
cin >> infile2;
ifstream fin2(infile2);
if (!fin2) {
cerr << "Errore: impossibile aprire file " << infile2 << "\n";
exit(2);
}
cout << "Nome del file di output: ";
cin >> outfile;
ofstream fout(outfile);
if (!fout) {
cerr << "Errore: impossibile aprire file " << outfile << " in scrittura.\n";
exit(3);
}

// Inizio operazione di lettura e merge dei file
char matr1[7], cog1[20], nom1[20];
char matr2[7], cog2[20], nom2[20];
// abbiamo ipotizzato che la matricola abbia al massimo 6 caratteri
// e che cognome e nome abbiano al massimo 19 caratteri
fin1 >> matr1 >> cog1 >> nom1;
fin2 >> matr2 >> cog2 >> nom2;
while (fin1 && fin2)
{
while (fin1 && fin2 && (strcmp(cog1,cog2) < 0 || strcmp(cog1,cog2) == 0 && strcmp(nom1,nom2) < 0) )//questo la prima riga che nn mi chiara
{
fout << matr1 << ' ' << cog1 << ' ' << nom1 << endl;
fin1 >> matr1 >> cog1 >> nom1;
}
while (fin1 && fin2 && (strcmp(cog1,cog2) > 0 || strcmp(cog1,cog2) == 0 && strcmp(nom1,nom2) >= 0) )questa la seconda riga che non mi chiara
{
fout << matr2 << ' ' << cog2 << ' ' << nom2 << endl;
fin2 >> matr2 >> cog2 >> nom2;
}
}
// almeno uno dei due file e' terminato: gestiamo la coda dell'altro
while (fin1)
{
fout << matr1 << ' ' << cog1 << ' ' << nom1 << endl;
fin1 >> matr1 >> cog1 >> nom1;
}
while (fin2)
{
fout << matr2 << ' ' << cog2 << ' ' << nom2 << endl;
fin2 >> matr2 >> cog2 >> nom2;
}
fin1.close();
fin2.close();
fout.close();
return 0;
}



grazie in anticipo a tutti...
saluti :ciauz:

mattneri
14-02-2006, 15:45
Innanzitutto devi capire come funziona strcmp()

Ritorna un intero che < 0 se la stringa1 minore della stringa2, ritorna 0 se uguali, e > 0 se la stringa1 maggiore della 2

--------------------------------


while (fin1 && fin2 && (strcmp(cog1,cog2) < 0 || strcmp(cog1,cog2) == 0 && strcmp(nom1,nom2) < 0) )

Il ciclo viene eseguito quando il cognome1 viene prima del cognome2 oppure quandi i cognomi sono uguali ma il nome1 viene prima del nome2

Capita questa capisci anche la seconda riga

Loading