Visualizzazione dei risultati da 1 a 2 su 2

Discussione: [C++] "Merge" di file

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    35

    [C++] merge di file

    ciao a tutti...
    dovrei capire come funziona questo programma, ma ci sono 2 passaggi che nn riesco prorpio a capire!!!
    c'è qualcuno che può commentarmeli???

    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 l’introduzione 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 è:


    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

  2. #2
    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

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

    codice:
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.