NOTA: Debido al define limpiar, este código funciona con Windows y Linux, pero no con otros Sistemas Operativos como iOS. Sería cuestión de añadirle uno para tu sistema ;)
#include <iostream> // entrada y salida por consola
#include <fstream> // entrada y salida por ficheros
#include <string> // para string
#include <stdlib.h> // para system
#include <stdio.h> //para remove
#include <iomanip> // pata setw
using namespace std;
#ifdef _WIN32
#define limpiar system("cls")
#endif
#ifdef linux
#defain limpiar system("clear");
#endif
int main() {
cout << "No te equivoques a la hora de escribir, la ruta, o el archivo, porque si no deberas volver a empezar...\n\n";
cout << "\tIntroduce la ruta del primer archivo: ";
string s1;
getline(cin, s1);//cojo de la consola la primera ruta con espacios incluidos
cout << "\tIntroduce la ruta del segundo archivo: ";
string s2;
getline(cin, s2); // y aqui la segunda ruta
const char* Ruta1 = s1.c_str(); //Las transformo a const char ya que mas a delante
const char* Ruta2 = s2.c_str(); //las utilizare para abrir ficheros, y si no son const char se queja el compilador
//basicamente lo que hace s1.c_str() es asignar al puntero Ruta1 la posicion donde empieza el string,
ifstream File1(Ruta1, ios::in); //Abrimos los dos ficheros en modo de lectura
ifstream File2(Ruta2, ios::in); //
if (File1.fail() || File2.fail()){ // en el caso de que uno de los dos ficheros no exista...
limpiar;
cout << "Ha habido un error, escriba correctamente la Ruta o el archivo\n";
cout << "Aprete intro para continuar";
cin.get(); // esperamos a que aprete intro
limpiar;
main(); //volvemos a empezar
}
else {//si ambos ficheros se han encontrado y se han abierto correctamente...
ofstream comparacion("Comparacion.txt", ios::out); //declaramos y abrimos otro fichero en modo de escritura
bool iguales = true;
int cont = 0, linea = 0;
limpiar;
cout << "Iniciando comparacion....\n";
while (!File1.eof() && !File2.eof()) { // mientras que ninguno de los dos ficheros se haya acabado
++linea;
string a, b;
getline(File1, a); // metemos en el string a la primera linea del fichero 1
getline(File2, b); // metemos en el string b la primera linea del fichero 2
if (a != b) { // si son diferentes....
++cont;
cout << flush << "Error numero " << cont << " en la linea " << linea << endl << flush;
comparacion << flush << "Error numero " << cont << " en la linea " << linea << endl << flush;
iguales = false;
cout << setw(20) << right << s1 << " : " << a << endl;
cout << setw(20) << right << s2 << " : " << b << endl;
comparacion << setw(20) << right << s1 << " : " << a << endl;
comparacion << setw(20) << right << s2 << " : " << b << endl;
}//Sacamos por pantalla en un formato determinado las diferencias y tambien en un fichero
}
if (!File1.eof() && File2.eof()) {//en el caso de que hayamos llegado al final del primer fichero pero no del segundo...
cout << "El archivo " << Ruta2 << " es mas corto que " << Ruta1 << endl;
comparacion << "El archivo " << Ruta2 << " es mas corto que " << Ruta1 << endl;
}
if (!File2.eof() && File1.eof()) {//... al reves que el anterior
cout << "El archivo " << Ruta1 << " es mas corto que " << Ruta2 << endl;
comparacion << "El archivo " << Ruta1 << " es mas corto que " << Ruta2 << endl;
}
comparacion.close();//cerramos el fichero de salida!! (esto es importante cuando abrimos un fichero mas a delante se ha de cerrar)
if (iguales) cout << "\nEnhorabuena los dos ficheros son iguales\n";
cout << "*--------Fin de la comparacion-------*\n";
cout << "Pulse s si quiere guardar los datos en un archivo\n En caso contrario pulse otra letra\n";
char c;
cin >> c;
if (c != 's') remove("Comparacion.txt");//en el caso de que el usuario no quiera un fichero con las diferencias sacadas por la
//consola, pues el que habiamos creado y llenado con todos los datos lo eliminamos
}
}
Bueno, espero que hayáis aprendido tanto como yo con esta práctica :p La verdad es que la veo muy interesante.
Saludos ;)
No hay comentarios:
Publicar un comentario