/* FILE: words2.cpp last change: 12-Mar-2001 * Il programma legge un file di testo una linea per volta e scrive un file * con una linea per riga preceduta da un numero progressivo. Le linee * sono salvate in ordine opposto a quello con cui sono state lette. */ #include #include #include #include #include "Stack4.H" void usage(char *nome); // Prototipo di una funzione const MAXSIZE = 1024; // La dimensione del buffer main(int argc, char ** argv) { if (argc < 3) // Devo avere almeno 2 argomenti sulla linea di comando usage(argv[0]); ifstream my_inp(argv[1]); // Apro il file in lettura if (!my_inp) { cerr << "Errore: non posso aprire il file " << argv[1] << " in lettura." << endl; exit(-1); } // Copio una riga per volta dal primo file nel secondo. Utilizzo un buffer // costituito da MAXSIZE caratteri. char buff[MAXSIZE]; long cntr = 0; int fine_loop = 0; Stack s; // Stack di puntatori a caratteri while(!fine_loop) { // Scorro il file finche` non arrivo alla fine my_inp.getline(buff, MAXSIZE); // Cerco di leggere una nuova riga if (my_inp.eof()) // Quando raggiungo la fine del file mi fermo fine_loop = 1; else { // Se non sono alla fine del file, scrivo la nuova riga cntr++; ostrstream myostr; // Dichiarazione di un oggetto di tipo ostream. // La stringa sara` maneggiato dinamicamente. myostr << buff << ends; // Termino la stringa esplicitamente s.Push(myostr.str()); // E metto nella mia Pila il puntatore. // Implica l'esecuzione di un freeze } } my_inp.close(); // Chiudo il file in lettura ofstream my_out(argv[2]); // Apro il file in scrittura if (!my_out) { cerr << "Errore: non posso aprire il file " << argv[2] << " in Scrittura." << endl; exit(-1); } // Il numero di cifre massime da stampare prima di ciascuna linea int ncifre = (int)ceil(log10(cntr)); my_out.setf(ios::fixed|ios::right); long cntr2 = 0; while(!s.IsEmpty()) { // Recupero le parole dalla Pila my_out << setw(ncifre) << ++cntr2 << ": " << s.Pop() << endl; } my_out.close(); // Chiudo il file in scrittura cout << "Sono state lette e riscritte " << cntr << " linee." << endl; exit(0); } // Funzione che descrive la modalita` di funzionamento del programma. void usage(char *nome) { cerr << "Uso:\n\t"; cerr << nome << " file_in file_out" << endl; cerr << "Dove:" << endl; cerr << "\tfile_in: nome del file di testo sorgente" << endl; cerr << "\tfile_out: nome del file destinazione." << endl; exit(0); }