예제 #1
0
Libro::Libro(Libro& unLibro){
	cout << "llamando al constructor de copias" << endl;

	titulo = unLibro.getTitulo();
	codigo=unLibro.getCodigo();

}
예제 #2
0
int Servicios::procesarLibro(int indice)
{
	int error = 0;
	SinIndice *listas = SinIndice().getInstancia();

	list<unsigned int> *lista;

	switch(indice)
	{
		case INDICE_AUTORES :lista = listas->getPendientesAutores();break;
		case INDICE_EDITORIALES:lista = listas->getPendientesEditoriales();break;
		case INDICE_TITULOS:lista = listas->getPendientesTitulos();break;
		case INDICE_PALABRAS:lista = listas->getPendientesPalabras();break;
	}

	for (list<unsigned int>::iterator it = lista->begin(); it != lista->end(); it++)
	{
		Libro *libro = 0;
		int error = recuperarLibro((*it), &libro);
		cout <<"Autor: "<< libro->getAutor() <<endl;
		cout <<"Editorial: "<< libro->getEditorial() <<endl;
		cout <<"Titulo: "<< libro->getTitulo() <<endl;
		cout <<"Id: "<< libro->getId() <<endl;
		cout <<"Cant.palabras: " << libro->getCantPalabras() << endl;
		//cout << "Presione ENTER para continuar...." << endl;
		//cin.get();

		switch(indice)
		{
			case INDICE_AUTORES :error = agregarIndiceAutores(libro);break;
			case INDICE_EDITORIALES:error = agregarIndiceEditoriales(libro);break;
			case INDICE_TITULOS:error = agregarIndiceTitulos(libro);break;
			case INDICE_PALABRAS:error = agregarIndicePalabras(libro);break;
		}

		delete libro;
	}

//limpia la lista de ids pendientes de procesar
	switch(indice)
	{
		case INDICE_AUTORES :error = listas->limpiarListaAutores();break;
		case INDICE_EDITORIALES:error = listas->limpiarListaEditoriales();break;
		case INDICE_TITULOS:error = listas->limpiarListaTitulos();break;
		case INDICE_PALABRAS:error = listas->limpiarListaPalabras();break;
	}

	return error;
}
예제 #3
0
int main() {

	int opcion = 0;
	int opcionClientes = 0;
	int tempOpcion = 0;
	int tempID = 0;
	int id = 0;
	int idLibros = 0;
	int numItem = 0;
	int cantidad = 0;
	int precio = 0;
	bool continuar = true;
	bool volverMenu = true;
	char estado;
	char tempConfirmacion;
	string nombre = "";
	string apellido = "";
	string direccion = "";
	string titulo = "";
	string autor = "";
	string codigoLibro = "";


	ListaClientes* lista = new ListaClientes();
	ListaLibro* listaLibro = new ListaLibro();


	while(continuar){


		cout << "\n\nBienvenido a Shopping Somewhere\n" << endl;
		cout << "Menú principal:" << endl;
		cout << "1 - Clientes" << endl;
		cout << "2 - Libros" << endl;
		cout << "3 - Órdenes" << endl;
		cout << "4 - Salir\n" << endl;

		cout << "Seleccione una opcion: ";
		cin >> opcion;

		switch(opcion){
		case 1:
			while(volverMenu){
				cout << "\nMenu de clientes:" << endl;
				cout << "1 - Listar Clientes" << endl;
				cout << "2 - Crear Cliente" << endl;
				cout << "3 - Buscar Cliente" << endl;
				cout << "4 - Modificar Cliente" << endl;
				cout << "5 - Eliminar Cliente" << endl;
				cout << "6 - Volver al menu principal\n" << endl;

				cout << "Seleccione una opcion: ";
				cin >> opcionClientes;

				switch(opcionClientes){

					case 1:
						lista->listarClientes();
						break;

					case 2:
						{
							cout << "Creación de clientes\n" << endl;
							cout << "Nombre: ";
							cin >> nombre;

							cout << "Apellido: ";
							cin >> apellido;

							cout << "Dirección: ";
							cin >> direccion;

							Cliente* cliente = new Cliente();
							id++;
							cliente->crearCliente(id,nombre,apellido,direccion);
							lista->agregar(cliente);
						}
						break;

					case 3:
					{
						string nombreCliente = "";
						cout<<"Introduzca el nombre del cliente: "<<endl;
						cin>>nombreCliente;
						int contador = 0;
						string clientes[] = {};

						Cliente* busquedaCliente = lista->getPrimerElemento();

						while(busquedaCliente != NULL){
							clientes[contador] = busquedaCliente->getNombre();
							//cout << cliente[contador] << endl;
							busquedaCliente = busquedaCliente->getSiguienteCliente();
							contador++;
							//cout<<contador<<endl;

						}
						//cout<<nombreCliente<<endl;

						vector<string> myvector(clientes, clientes+(sizeof(clientes)/sizeof(clientes[0])));
						sort(myvector.begin(), myvector.end());
						if(lista->buscar(myvector, myvector.size(), nombreCliente) > -1){
								cout<<"Found "+nombreCliente<<endl;
						}
							else
							{
								cout<<"Not found "+nombreCliente<<endl;
							}


					}
						break;

					case 4:

						lista->listarClientes();
						cout << "\nIntroduzca el numero de cliente a modificar: ";
						cin >> tempOpcion;
						lista->modificar(tempOpcion);
						break;

					case 5:

						lista->listarClientes();
						cout << "\nElige el numero del cliente a eliminar: ";
						cin >> tempID;
						cout << tempID;
						cout << "\nEsta seguro de elimar el contacto (s/n): ";
						cin >> tempConfirmacion;
						if(tempConfirmacion == 's' || tempConfirmacion == 'S'){
							lista->eliminar(tempID);
						}
						break;

					case 6:
						{
							cout <<"Saliendo..." << endl;
							volverMenu = false;
						}
						break;
				}
			}
			break;

			case 2:
				while(volverMenu){
					cout << "\nMenu de Libros:" << endl;
					cout << "1 - Listar Libros" << endl;
					cout << "2 - Crear Libro" << endl;
					cout << "3 - Buscar Libro" << endl;
					cout << "4 - Modificar Libro" << endl;
					//cout << "5 - Cambiar Libro" << endl;
					cout << "5 - Volver al menu principal\n" << endl;

					cout << "Seleccione una opcion: ";
					cin >> opcionClientes;

					switch(opcionClientes){

						case 1:
							listaLibro->listarLibro();
							break;

						case 2:
							{
								cout << "Insercion de nuevo libro\n" << endl;
								cout << "Titulo: ";
								cin >> titulo;

								cout << "Autor: ";
								cin >> autor;

								cout << "Codigo del libro: ";
								cin >> codigoLibro;

								cout << "Cantidad: ";
								cin >> cantidad;

								cout << "Precio: ";
								cin >> precio;
								/*cout << "Dirección: ";
								cin >> estado;*/

								Libro* libro = new Libro();
								idLibros++;
								libro->crearLibro(idLibros, titulo, autor, codigoLibro, 'D', cantidad ,precio);
								listaLibro->agregar(libro);
							}
							break;

						case 4:

							listaLibro->listarLibro();
							cout << "\nIntroduzca el numero del libro a modificar: ";
							cin >> tempOpcion;
							listaLibro->modificar(tempOpcion);
							break;

						/*case 5:

							listaLibro->listarLibro();
							cout << "\nElige el numero del libro a cambiar el estado: ";
							cin >> tempID;
							cout << "\nEsta seguro cambiar el estado (s/n): ";
							cin >> tempConfirmacion;
							if(tempConfirmacion == 's' || tempConfirmacion == 'S'){
								listaLibro->cambiarEstado(tempID);
							}
							break;*/

						case 5:
							{
								cout <<"Saliendo..." << endl;
								volverMenu = false;
							}
							break;
					}
				}
				break;

			case 4:

				cout <<"Saliendo..." << endl;
				continuar = false;
				break;

			default:
				cout <<"'"<< opcion <<"' no es un valor válido" << endl;
				break;
		}
	}

	return 0;
}
void ColeccionLibros::cargarLibro(){
	Libro * lib = new Libro;
	Aparicion * apa = new Aparicion;
	string palabra;
	int parrafos = 0;
	int palabras = 0;

	lib->leer();

	insertar(lib);

	apa->iniciarActuales();

	palabra = apa->leerAparicion(lib);

	while (palabra != "fiiin"){
		
		bool insertado = false;
	
		// Si la palabra que se lee ya existía en el árbol...
		if (diccionario.consultar(palabra)){

			// ... accedemos a la lista de apariciones que ya tenía dicha palabra creada...
			list<Aparicion*> * listaApariciones = diccionario.listaAparicionArbolActual(palabra);
			
			// ... y la insertamos con las restricciones de menor/mayor blablabla...
			list<Aparicion*>::iterator it = listaApariciones->begin();
			for (it = listaApariciones->begin(); it != listaApariciones->end(); it++){


				if (((*it)->devuelveLibro()->codigoisbn() < apa->devuelveLibro()->codigoisbn())
					&& !insertado){
					listaApariciones->insert(it, apa);
					insertado = true;
				}

				else if (((*it)->devuelveLibro()->codigoisbn() == apa->devuelveLibro()->codigoisbn()) 
					&& ((*it)->ncapA() < apa->ncapA())
					&& !insertado) {
					
					listaApariciones->insert(it,apa);
					insertado = true;
				}


				else if (((*it)->devuelveLibro()->codigoisbn() == apa->devuelveLibro()->codigoisbn()) 
					&& ((*it)->ncapA() == apa->ncapA())
					&& ((*it)->nparA() < apa->nparA())
					&& !insertado){
					
					listaApariciones->insert(it,apa);
					insertado = true;
				}

				else if (((*it)->devuelveLibro()->codigoisbn() == apa->devuelveLibro()->codigoisbn()) 
					&& ((*it)->ncapA() == apa->ncapA())
					&& ((*it)->nparA() == apa->nparA())){
					
					delete apa;
					insertado = true;
				}
			}

			if (!insertado && it == listaApariciones->end()){
				listaApariciones->insert(it,apa);
		}

		diccionario.actualizarListaAparicion(palabra, listaApariciones);
		}

		// Si la palabra que se lee NO existía en el árbol..
		else{
			// .. se crea una nueva lista (a la que se le mete la aparición al principio), y ésta al árbol.
			diccionario.insertar(palabra);
			list<Aparicion*> * listaApariciones = new list<Aparicion*>();
			list<Aparicion*>::iterator it = listaApariciones->begin();
			listaApariciones->insert(it,apa);
			
			diccionario.actualizarListaAparicion(palabra, listaApariciones);

		}

		parrafos = apa->totalParrafos();
		palabras = apa->totalPalabras();

		apa = new Aparicion;

		palabra = apa->leerAparicion(lib);
	}
	
	delete apa;

	lib->mostrarLargo();
	cout << parrafos << " párrafos" << endl;
	cout << palabras << " palabras" << endl;
}
void ColeccionLibros::consultar(int isbn){
	Libro * libro = libros.consultar(isbn);

	if(libro == NULL) cout << "ISBN " << isbn << " no encontrado" << endl;
	else libro->mostrarLargo();
}
예제 #6
0
파일: main.cpp 프로젝트: RGaldamez/CRUDARLF
int main(int argc, char const *argv[]){
	//Editorial editoriales[30];
	int seleccionMenu;
	bool headerExists = false;
	bool repeat = true;
	bool headerDirty = false;
	bool dirtyHeader = false;
	bool indexExists = false;
	Header header(-1, sizeof(Libro),0,false);
	bool noWrite = false;
	//editorialID nombre Direccion

	//creating index, attempt 2
	ifstream infileLibros("libros.bin",ios::binary);
	ifstream infileIndex("index.bin",ios::binary);
	ifstream infileEditorial("editoriales.bin", ios::binary | ios::in);
	Header jader;
	int aHierro = 0;
	char nombreEditoriales[21][25] = {"Alfaguara", "Algaida", "Almadraba", "Algar", "Almuzara",
	 "Anaya", "Apila","Buen Paso","Bambu","Berenice",
	 "Barcanova","Brosquil","Casals","Bromera",
	 "Coco Books","ComaNegra","Creagem","Edebe","Edelvives","Destino"};
	char direccionEditoriales[21][25] = {"La Canoa","Puerto Rico","Las Hadas","Las Uvas","Villa Olimpica",
	"Kennedy","Kansas","California","Romania","Grecia",
	"Francia","Alemania","Los Tostones","Mexico","Canada",
	"China","Portugal","Chile","Colombia","Venezuela"};

	if(!infileEditorial.good()){
		infileEditorial.close();
		ofstream edit("editoriales.bin", ios::binary| ios::out | ios::trunc);
		Editorial* editor;
		for (int i = 1; i < 21; ++i){
				editor = new Editorial(i,nombreEditoriales[i],direccionEditoriales[i]);
				edit.write(reinterpret_cast<char*>(&editor), sizeof(Editorial));
				delete editor;
		}
		edit.close();
	}else{
		infileEditorial.close();
	}










	if (infileLibros.good()){
		infileLibros.seekg(0);
		infileLibros.read(reinterpret_cast<char*>(&jader), sizeof(Header));
		dirtyHeader = jader.getDirty();
		if (dirtyHeader == true){
			aHierro = 1;
		}
	}

	infileLibros.close();
	infileIndex.close();

	if (aHierro == 1){
		cout<<"Creando Index..."<<endl;
		ifstream Registry("libros.bin", ios::binary);
		Registry.seekg(sizeof(Header));
		Libro bookTemp;
		vector<char*> keys;
		vector<long int> offsets;
		int contadorRegistros= 0;

		while(!Registry.eof()){
			Registry.read(reinterpret_cast<char*>(&bookTemp),sizeof(Libro));
			if(!Registry.eof()){
				if(!bookTemp.getDeleted()){
					keys.push_back(new char[14]);
					char finalKey[14] ;
					for (int i = 0; i < 13; ++i){
						finalKey[i] = bookTemp.getISBN()[i+9];
					}
					finalKey[14] = '\0';
					strcpy(keys.at(keys.size()-1),finalKey);
					offsets.push_back(contadorRegistros*sizeof(Libro) + sizeof(header));
					contadorRegistros++;

					}else{
						contadorRegistros++;
					}
				}
					
		}
	

		vector<indexFile*> newRegistros;

		for (int i = 0; i < keys.size(); ++i){
			newRegistros.push_back(new indexFile(keys.at(i),offsets.at(i)));
		}

		//ORDENANDO LA LISTA DE newRegistros
		long int key1;
		long int key2;
		char keyTemp[14];
		long int offsetTemp;
		bool isI;
		bool isJ;
		indexFile indexTemp;
		vector<int> erasedPos;
		if(newRegistros.size()>1){
			for (int i = 0; i < newRegistros.size()-1; ++i){
				for (int j = 1; j < newRegistros.size(); ++j){
						
					key1 = atol(newRegistros.at(i)->getLlave());
					key2 = atol(newRegistros.at(j)->getLlave());

					if(key2<key1){
						//indexTemp = *newRegistros.at(i);
						//newRegistros.at(i) = newRegistros.at(j);
						//&newRegistros.at(j) = indexTemp;
						strcpy(keyTemp,newRegistros.at(i)->getLlave());
						//cout<<"Este es el KeyTemp: "<<keyTemp<<endl;
						offsetTemp = newRegistros.at(i)->getOffset();
						//cout<<"Este es su offset: "<<offsetTemp<<endl;
						delete newRegistros.at(i);
						newRegistros.at(i) = new indexFile(newRegistros.at(j)->getLlave(),newRegistros.at(j)->getOffset());
						delete newRegistros.at(j);
						newRegistros.at(j) = new indexFile(keyTemp,offsetTemp);






						/*
						isI = false;
						isJ = false;
						for (int k = 0; k < erasedPos.size(); ++k){
							if(i == erasedPos.at(k)){
								isI = true;
								break;
							}
						}
						for (int k = 0; k < erasedPos.size(); ++k){
							if(j == erasedPos.at(k)){
								isJ = true;
								break;
							}
						}

						if(!isI){
							erasedPos.push_back(i);
						}
						if(!isJ){
							erasedPos.push_back(j);
						}
						*/
					}
				}	
			}
		}


		ofstream indice("index.bin",ios::binary| ios::trunc | ios::out);
		for (int i = 0; i < newRegistros.size(); ++i){
			indice.write(reinterpret_cast<char*>(newRegistros.at(i)),sizeof(indexFile));
		}
		indice.close();

		for (int i = 0; i < keys.size(); ++i){
			delete keys.at(i);
		}
		//bool deleteR;
		//for (int i = 0; i < newRegistros.size(); ++i){
			/*deleteR = true;
			for (int j = 0; j < erasedPos.size(); ++j){
				if(i == erasedPos.at(j)){
					deleteR = false;
					break;
				}
			}
			if(deleteR){
				delete newRegistros.at(i);
			}
			*/
		//	delete newRegistros.at(i);
		//}
			for (int i = 0; i < newRegistros.size(); ++i){
				delete newRegistros.at(i);
			}




	}

	bool RealDirty = false;
	int contadorAle = 0;

	do {

		ifstream ifstreamer("libros.bin", ios::binary | ios::in);
		Header temptemptemp;
		ifstreamer.seekg(0);
		ifstreamer.read(reinterpret_cast<char*>(&temptemptemp), sizeof(Header));
		ifstreamer.close();
		cout<<"Avail List = "<<temptemptemp.getAvailList()<<endl;

		seleccionMenu = menu();
		cout<<seleccionMenu<<endl;
		ifstream infile("libros.bin",ios::binary);
		if (!headerExists){
			if(!infile.good()){
				infile.close();
				ofstream fileWrite("libros.bin",ios::binary| ios::trunc | ios::out);
				//int availList,int sizeOfCampo,int RecordCount,bool DirtyBit
				//fileWrite.write(reinterpret_cast<char*>(&header,sizeof(Header)));
				fileWrite.write(reinterpret_cast<char*>(&header),sizeof(Header));
				fileWrite.close();
				headerExists = true;
				
			}else{
				ifstream infile("libros.bin",ios::binary);			
				infile.read(reinterpret_cast<char*>(&header),sizeof(Header));
				infile.close();
				headerExists = true;
			}
		}

		if(seleccionMenu==1){
			contadorAle++;
			char defaultAvail[] = "0000000-1";
			char ISBN [23];
			char ISBNTemp[14];
			char Nombre[76];
			char Autor[76];
			unsigned int editorialID;
			cin.ignore();
			cout<<"Porfavor ingrese el ISBN del libro: ";
			cin.getline(ISBNTemp,14);
			strcpy(ISBN,defaultAvail);
			strcat(ISBN,ISBNTemp);
			cout<<endl;
			cout<<"Porfavor ingrese el nombre del libro: ";
			cin.getline(Nombre,76);
			cout<<endl;
			cout<<"Porfavor ingrese el nombre del autor del libro: ";
			cin.getline(Autor,76);
			cout<<endl;
			cout<<"porfavor ingrese un ID (1 - 20) : ";
			cin>>editorialID;
			Libro libroTemp(ISBN,Nombre,Autor,editorialID);
			Header Heather;

			ifstream heath("libros.bin", ios::binary | ios::in);
			heath.seekg(0);
			heath.read(reinterpret_cast<char*>(&Heather), sizeof(Header));
			heath.close();




			if (Heather.getAvailList()==-1){
				ofstream outfile("libros.bin",ios::binary | ios::app | ios::ate);
				outfile.write(reinterpret_cast<char*>(&libroTemp),sizeof(Libro));
				outfile.close();
				header.setRecordCount(header.getRecordCount()+1);
				headerDirty = true;
				RealDirty = true;

			}else{
				long int offset = Heather.getAvailList();
				long int nextOffset;
				ifstream readFile("libros.bin", ios::binary | ios::in);
				Libro Book;
				readFile.seekg(offset);
				readFile.read(reinterpret_cast<char*>(&Book), sizeof(Libro));
				readFile.close();
				nextOffset = Book.getAvail();


				fstream outfile("libros.bin", ios::binary | ios::in | ios::out);
				outfile.seekp(offset);
				outfile.write(reinterpret_cast<char*>(&libroTemp), sizeof(Libro));

				Heather.setAvailList(nextOffset);
				outfile.seekp(0);
				outfile.write(reinterpret_cast<char*>(&Heather), sizeof(Header));
				outfile.close();


				header.setRecordCount(header.getRecordCount()+1);
				headerDirty = true;
				RealDirty = true;






				/*
				long int offset = (header.getAvailList()*sizeof(Libro)) + sizeof(Header);
				streampos pos = offset;
				ifstream infile("libros.bin", ios::binary);
				infile.seekg(pos);
				Libro temp;
				infile.read(reinterpret_cast<char*>(&temp),sizeof(Libro));
				char deletedISBN[23];
				strcpy(deletedISBN,temp.getISBN());
				char newposition[7];

				int contador = 0;
				int contadorAsterisco = 0;
				int debug;
				while(contadorAsterisco<2){
					if(deletedISBN[contador]=='*'){
						contadorAsterisco++;
					}else{
						if(contador==1){
							newposition[0] = deletedISBN[contador+1];
						}else{
							newposition[contador+1] = deletedISBN[contador];
						}
					}
				}
				//long int nuevoElementoAvail = static_cast<long int>(&newposition);
				long int nuevoElementoAvail = (long int) newposition;
				header.setAvailList(nuevoElementoAvail);

				fstream outfile("libros.bin", ios::binary | ios::out | ios::in);
				outfile.seekp(pos);
				outfile.write(reinterpret_cast<char*>(&libroTemp), sizeof(Libro));
				outfile.close();
				headerDirty = true;
				header.setRecordCount(header.getRecordCount()+1);
				RealDirty = true;
				*/

				
			}

				
		
		}else if(seleccionMenu==2){
			ifstream infile("libros.bin",ios::binary);
			Libro libro;
			infile.seekg(sizeof(Header));
			int contador = 0;
			while(!infile.eof()){
				char actualISBN[23];
				char ISBNfinal[14];
				int contadorFinal=0;
				int contadorAsterisco=0;
				

				infile.read(reinterpret_cast<char*>(&libro),sizeof(Libro));	
				strcpy(actualISBN,libro.getISBN());

				/*if (actualISBN[0] == '*'){
					for (int i = 0; i < strlen(actualISBN); ++i){
						if(actualISBN[i] == '*'){
							contadorAsterisco++;
						}
						if(contadorAsterisco == 2){
							ISBNfinal[contadorFinal] = actualISBN[i];
							contadorFinal++;
						}
					}
				}
				*/
				char ISBNToShow[14];
				int contadorToShow=0;
				if(ISBNfinal[7] == '-'){
					for (int i = 0; i < 14; ++i){
						ISBNToShow[i] = libro.getISBN()[i+9];
					}
					ISBNToShow[14] = '\0';
					
					
					if (!infile.eof() && libro.getMark() != '*'){
						contador++;
						cout<<endl;
						cout<<contador<<": ";
						cout<< "ISBN: "<<ISBNToShow<<endl;
						cout<<"Nombre del Libro: "<<libro.getNombre()<<endl;
						cout<<"Autor: "<<libro.getAutor()<<endl;
						cout<<"Nombre de la Editorial: "<<nombreEditoriales[libro.getEditorialID()]<<endl;
						cout<<"Direccion de la Editorial: "<<direccionEditoriales[libro.getEditorialID()]<<endl<<endl;

					}

				}else{
					char ISBNToShow[14];
					int contadorshow = 0;
					/*
					for (int i = 0; i < strlen(libro.getISBN()); ++i){
						if (i>8){
							ISBNToShow[contadorshow] = libro.getISBN()[i];
							contadorshow++;
						}
					}
					*/
					for (int i = 0; i < 14; ++i){
						ISBNToShow[i] = libro.getISBN()[i+9];
					}
					ISBNToShow[14] = '\0';
					if (!infile.eof() && libro.getMark() != '*'){
						contador++;
						cout<<contador<<"= ";
						cout<< "ISBN: "<<ISBNToShow<<endl;
						cout<<"Nombre del Libro: "<<libro.getNombre()<<endl;
						cout<<"Autor: "<<libro.getAutor()<<endl;
						cout<<"Nombre de la Editorial: "<<nombreEditoriales[libro.getEditorialID()]<<endl;
						cout<<"Direccion de la Editorial: "<<direccionEditoriales[libro.getEditorialID()]<<endl<<endl;
					}

				}

					
			}
			infile.close();
			
			

		}/*else if (seleccionMenu==3){

			//Modificar
			char busquedaLibro[14];
			cout<<endl<<"Porfavor ingrese el ISBN del libro que desea modificar: ";
			cin.ignore();
			cin.getline(busquedaLibro,14);
			cout<<endl;
			ifstream index("index.bin",ios::binary|ios::in);
			indexFile indexTemp;
			long int offset;
			bool found = false;
			while(!index.eof()){
				index.read(reinterpret_cast<char*>(&indexTemp),sizeof(indexFile));
				if(!index.eof()){
					if(strcmp(busquedaLibro,indexTemp.getLlave()) == 0){
						cout<<"Se encontro el Libro: "<<endl;
						offset = indexTemp.getOffset();
						found = true;
						break;
					}
				}
			}
			index.close();

			if(found){
				Libro actual;
				ifstream libroFile("libros.bin", ios::binary | ios::in);
				libroFile.seekg(offset);
				libroFile.read(reinterpret_cast<char*>(&actual), sizeof(Libro));
				char toShow[14];
				int eleccionMod;
				for (int i = 0; i < 14; ++i){
					toShow[i] = actual.getISBN()[i+9];
				}
				toShow[14] = '\0';

				cout<< "ISBN: "<<toShow<<endl;
				cout<<"Nombre del Libro: "<<actual.getNombre()<<endl;
				cout<<"Autor: "<<actual.getAutor()<<endl;
				cout<<"ID Editorial: "<<actual.getEditorialID()<<endl<<endl;

				cout<<"Desea cambiar el ISBN junto a los otros datos? "<<endl;
				cout<<"1) Si"<<endl;
				cout<<"2) No"<<endl;
				cin>>eleccionMod;
				if(eleccionMod == 1){
					char ISBNTemp[14];
					char TempNombre[76];
					char TempAutor[76];
					unsigned int TempEditorial;
					cin.ignore();
					cout<<"Porfavor ingrese el ISBN del libro: ";
					cin.getline(ISBNTemp,14);
					char temptemp[23];
					strcpy(temptemp, actual.getISBN());
					for (int i = 0; i < 14; ++i){
						temptemp[i+9] = ISBNTemp[i];
					}
					actual.setISBN(temptemp);
					cout<<endl;
					cout<<"Porfavor ingrese el nombre del libro: ";
					cin.getline(TempNombre,76);
					cout<<endl;
					cout<<"Porfavor ingrese el nombre del autor del libro: ";
					cin.getline(TempAutor,76);
					cout<<endl;
					cout<<"porfavor ingrese un ID: ";
					cin>>TempEditorial;
					actual.setNombre(TempNombre);
					actual.setAutor(TempAutor);
					actual.setEditorialID(TempEditorial);

					fstream bookMod("libros.bin", ios::binary | ios::in | ios::out);
					bookMod.seekp(offset);
					bookMod.write(reinterpret_cast<char*>(&actual), sizeof(Libro));
					bookMod.close();
					headerDirty = true;
				}else{
					char TempNombre[76];
					char TempAutor[76];
					unsigned int TempEditorial;
					cin.ignore();
					cout<<endl;
					cout<<"Porfavor ingrese el nombre del libro: ";
					cin.getline(TempNombre,76);
					cout<<endl;
					cout<<"Porfavor ingrese el nombre del autor del libro: ";
					cin.getline(TempAutor,76);
					cout<<endl;
					cout<<"porfavor ingrese un ID: ";
					cin>>TempEditorial;
					actual.setNombre(TempNombre);
					actual.setAutor(TempAutor);
					actual.setEditorialID(TempEditorial);
					cout<<"temp editorial: "<<actual.getEditorialID()<<endl;

					fstream bookMod("libros.bin", ios::binary | ios::in | ios::out);
					bookMod.seekp(offset);
					bookMod.write(reinterpret_cast<char*>(&actual), sizeof(Libro));
					bookMod.close();
				}
			}else{
				cout<<"Lo siento no pude encontrar ese libro :( "<<endl;
			}

		}*/else if (seleccionMenu==3){
			crearIndice();
			

			char busquedaLibro[14];
			cout<<endl<<"Porfavor ingrese el ISBN del libro que desea eliminar: ";
			cin.ignore();
			cin.getline(busquedaLibro,14);
			long int offset;
			bool found = false;
			cout<<endl;
			indexFile indexTemp1;
			ifstream indexito("index.bin", ios::binary | ios::in);
			
		
			while(!indexito.eof()){
				indexito.read(reinterpret_cast<char*>(&indexTemp1),sizeof(indexFile));
				if(!indexito.eof()){
					if(strcmp(busquedaLibro,indexTemp1.getLlave()) == 0){
						cout<<"Se encontro el Libro: "<<endl;
						offset = indexTemp1.getOffset();
						found = true;
						break;
					}
				}
			}
			indexito.close();
			if (found){
				int erase;
				Libro actual;
				ifstream libroFile("libros.bin", ios::binary | ios::in);
				libroFile.seekg(offset);
				libroFile.read(reinterpret_cast<char*>(&actual), sizeof(Libro));
				libroFile.close();
				char toShow[14];
				int eleccionMod;
				for (int i = 0; i < 14; ++i){
					toShow[i] = actual.getISBN()[i+9];
				}
				toShow[14] = '\0';

				cout<< "ISBN: "<<toShow<<endl;
				cout<<"Nombre del Libro: "<<actual.getNombre()<<endl;
				cout<<"Autor: "<<actual.getAutor()<<endl;
				cout<<"ID Editorial: "<<actual.getEditorialID()<<endl<<endl;

				cout<<endl<<"De verdad quiere borrar este libro?"<<endl;
				cout<<"1) SI"<<endl;
				cout<<"2) NO"<<endl;
				cin >> erase;
				cin.ignore();

				if(erase == 1){
					

					Header headercito;
					ifstream MaxHeader("libros.bin" , ios::binary | ios::in);
					MaxHeader.read(reinterpret_cast<char*>(&headercito), sizeof(Header));
					if (headercito.getAvailList() == -1){

						headercito.setAvailList(offset);
						actual.setAvail(-1);
					}else{
						actual.setAvail(headercito.getAvailList());
						headercito.setAvailList(offset);
					}
					MaxHeader.close();

					fstream borrar("libros.bin", ios::binary| ios::in | ios::out);
					borrar.seekg(0);
					borrar.write(reinterpret_cast<char*>(&headercito), sizeof(Header));
					borrar.seekg(offset);
					actual.setDeleted(true);
					actual.setMark('*');
					borrar.write(reinterpret_cast<char*>(&actual), sizeof(Libro));
					borrar.flush();
					borrar.close();
					headerDirty = true;
				}


			}
			noWrite = true;

	

		}else if (seleccionMenu == 4){
예제 #7
0
int Servicios::quitarArchivo(string unId)
{
	unsigned int id = atoi(unId.c_str());
	unsigned int offset = 0;

	cout<<"Eliminando libro "<<id<<"..."<<endl;

	//recuperar el offset del primario

	string pathArbolPrimario = Parametros().getParametro(CARPETA_DATOS);
	pathArbolPrimario += NOMBRE_BMAS_PRIMARIO;

	if (pathArbolPrimario == "") return ERROR_RUTA_BMAS_PRIMARIO;

	ArbolBMasNumerico *arbolP = new ArbolBMasNumerico(pathArbolPrimario, TAMANIO_BLOQUE_BMAS_NUMERICO);

	resultadoOperacion resultado(OK);

	Registro* registro = arbolP->buscarRegistroNumerico(id, &resultado);

	//TODO ver si esta recuperando bien el offset
	if (registro && resultado.getDescripcion() == "ENCONTRADO")
		offset = registro->getReferencias()->front();
	else
		return ERROR_LIBRO_INEXISTENTE;


//quitar de el archivo de registros variables

	string arcLibros = Parametros().getParametro(ARCHIVO_LIBROS);
	ArchivoLibros *archivo = new ArchivoLibros(arcLibros);
	Libro *libro = archivo->recuperarLibro(offset);
//	cout <<"Autor: "<< libro->getAutor() <<endl;
//	cout <<"Editorial: "<< libro->getEditorial() <<endl;
//	cout <<"Titulo: "<< libro->getTitulo() <<endl;
//	cout <<"Id: "<< libro->getId() <<endl;
//	cout <<"Cant.palabras: " << libro->getCantPalabras() << endl;
//	cout << "Presione ENTER para continuar...." << endl;
//	cin.get();

//	cout << "SACO EL LIBRO DEL ARCHIVO DE REGISTROS VARIABLES" << endl;
	archivo->suprimirLibro(offset);


//quitar del primario

	//cout << "QUITO DEL PRIMARIO EL ID" << endl;

	arbolP->eliminarNumerico(libro->getId());

	delete arbolP;

//quitar de los indices

	//cout << "SACO DE LOS INDICES" << endl;

	//cout << "SACO DE AUTORES" << endl;
	sacarDelArbol(NOMBRE_BMAS_AUTORES,libro->getAutor(),libro->getId());
	//cout << "Presione ENTER para continuar...." << endl;
	//cin.get();

	//cout << "SACO DE EDITORIALES" << endl;
	sacarDelArbol(NOMBRE_BMAS_EDITORIALES,libro->getEditorial(),libro->getId());
	///cout << "Presione ENTER para continuar...." << endl;
	//cin.get();

	//cout << "SACO DE TITULOS" << endl;
	sacarDelHash(NOMBRE_HASH_TITULOS,libro->getTitulo(),libro->getId());
	//cout << "Presione ENTER para continuar...." << endl;
	//cin.get();

	//cout << "SACO PALABRAS" << endl;
	//cout << "Procesando la quita del indice..." << endl;
	set<string> *palabras = libro->getListaPalabras();

	for (set<string>::iterator it = palabras->begin(); it != palabras->end(); it++)
	{
		sacarDelHash(NOMBRE_HASH_PALABRAS, *it ,libro->getId());
	}


//quitar de la lista de libros sin procesar
	//cout << "SACO DE LOS INDICES SIN PROCESAR" <<endl;
	SinIndice *listas  = SinIndice().getInstancia();
	listas->sacarLibroDeTodasLasListas(id);

	delete archivo;

	/*******************AGREGADO ENTREGA II*************************/


	string pathArbolPalabras = Parametros().getParametro(CARPETA_DATOS);
	pathArbolPalabras += NOMBRE_BMAS_PALABRAS;
	pathArbolPalabras += "_" + Util().UIntToString(id);

	resultadoOperacion resultadoOp(OK);


	ArbolBMasAlfabetico *arbolPal = new ArbolBMasAlfabetico(pathArbolPalabras, TAMANIO_BLOQUE_BMAS_PALABRAS);



	//recorrer el arbol de palabras
	Registro *reg = arbolPal->buscarRegistro("a",&resultadoOp);
	unsigned int lista;

	while (reg != NULL)
	{
		lista = reg->getReferenciai(1);
		ListasIds().eliminarLista(lista);
		reg = arbolPal->siguiente();
	}

	arbolPal->~ArbolBMasAlfabetico();

	Util().eliminarArchivo(pathArbolPalabras);

	/*******************AGREGADO ENTREGA II*************************/


	return 0;


}
예제 #8
0
int Servicios::obtenerLibro(string unId)
{
	unsigned int id = atoi(unId.c_str());
	fstream libro;
	string rutaSalida = Parametros().getParametro(CARPETA_SALIDA);
	string arcLibros = Parametros().getParametro(ARCHIVO_LIBROS);

	if (arcLibros == "") return ERROR_RUTA_ARCHIVO_LIBROS;

 	ArchivoLibros *archivo = new ArchivoLibros(arcLibros);
	Libro *unLibro = NULL;
	//intento recuperar el libro
	int resultadoRecuperacion = 0;
	resultadoRecuperacion = recuperarLibro(id,&unLibro);
	if( resultadoRecuperacion == ERROR_LIBRO_INEXISTENTE){
		return resultadoRecuperacion;
	};
// BORRAR
//	Parser *unParser = new Parser();
//	unParser->parsear("./archivos/libros/Justin Somper - Vampiratas 3 - Emboscada en el Océano.txt");
//	Libro *unLibro = unParser->getLibro();
//BORRAR

	string nombreArchivo = rutaSalida + unLibro->getTitulo();
	nombreArchivo += ".txt";

	libro.open(nombreArchivo.c_str(), ios::binary | ios::out);

	unsigned int tamanio;
	char* buff;
	string linea;

//autor
	linea = "Autor: ";
	linea += unLibro->getAutor();
	linea += "\n";
//editorial
	linea += "Editorial: ";
	linea += unLibro->getEditorial();
	linea += "\n";
//titulo
	linea += "Titulo: ";
	linea += unLibro->getTitulo();
	linea += "\n";
//texto
	linea += "\n\n...\n";
	linea += unLibro->getTexto();
	linea += "\n";

	tamanio = linea.size();
	buff= new char[tamanio];
	memcpy(buff,linea.c_str(),tamanio);
	libro.write(buff,tamanio);
	delete [] buff;

	libro.close();

	archivo->~ArchivoLibros();
	unLibro->~Libro();

	return 0;
}
예제 #9
0
int Servicios::tomarTexto(string ruta)
{

//parsear el libro
	Parser *unParser = new Parser();
	cout << "Procesando Libro...." << endl;
	if (unParser->parsear(ruta) != EXITOSO)
	{
		string rutaLibros = Parametros().getParametro(CARPETA_LIBROS);
		ruta = rutaLibros + ruta;
		if (unParser->parsear(ruta) != EXITOSO) return ERROR_RUTA_INVALIDA;
	}

	Libro *unLibro = unParser->getLibro();

	//cout << unLibro->toString() << endl; //BORRAR SOLO PARA PROBAR LA IMPRESION



	//cout << "parsie el libro" << endl;


//meter el libro en el archivo de registros variables
	string rutaArcLibros = Parametros().getParametro(ARCHIVO_LIBROS);

	if (rutaArcLibros == "") return ERROR_RUTA_ARCHIVO_LIBROS;

	ArchivoLibros *archivo = new ArchivoLibros(rutaArcLibros);

	//cout << "creo archivo de libros" << endl;



	unsigned int offset = 0;
	offset = archivo->agregarLibro(unLibro);
	delete archivo;

	//cout << "agrego el libro" << endl;



	string pathArbolPrimario = Parametros().getParametro(CARPETA_DATOS);
	pathArbolPrimario += NOMBRE_BMAS_PRIMARIO;

	if (pathArbolPrimario == "") return ERROR_RUTA_BMAS_PRIMARIO;

	ArbolBMasNumerico *arbolP = new ArbolBMasNumerico(pathArbolPrimario, TAMANIO_BLOQUE_BMAS_NUMERICO);
	//cout << "id: "<< unLibro->getId() << endl;
	arbolP->insertarNumerico(unLibro->getId(),offset);

	delete arbolP;

	//cout << "agrego al indice primario" << endl;


	/*******************AGREGADO ENTREGA II*************************/

	//crear el arbol de parlabras
	string pathArbolPalabras = Parametros().getParametro(CARPETA_DATOS);
	pathArbolPalabras += NOMBRE_BMAS_PALABRAS;
	pathArbolPalabras += "_" + Util().UIntToString(unLibro->getId());

	ArbolBMasAlfabetico *arbolPal = new ArbolBMasAlfabetico(pathArbolPalabras, TAMANIO_BLOQUE_BMAS_PALABRAS);

	map<string, list<int> > mapa = unParser->obtenerPalabras2();
	map<string, list<int> >::iterator itMap;
	string clave;
	unsigned int idLista;
	unsigned int posPal;
	string mejorP;
	unsigned int vieja,nueva,mejor = 0;

	//cout << "llego a insertar las cosas al arbol" << endl;
	//cin.get();

	///////////////////////  agrego la funcionalidad para guardar normas infinito   ///////

	string pathArbolPrim = Parametros().getParametro(CARPETA_DATOS);
	pathArbolPrim+= NOMBRE_BMAS_PRIMARIO;
	ArbolBMasNumerico* arbolPrimario = new ArbolBMasNumerico(pathArbolPrim,
			TAMANIO_BLOQUE_BMAS_NUMERICO);

	resultadoOperacion result(OK);
	Registro* regActual = arbolPrimario->buscarRegistroNumerico(0, &result);
	unsigned int N = 1;
	while (regActual != NULL) {
		regActual = arbolPrimario->siguiente();
		N++;
	}


	delete arbolPrimario;


	double acumuladoNormaInf=0;

	for (itMap = mapa.begin(); itMap != mapa.end(); itMap++)
	{
		clave  = itMap->first;
		posPal = itMap->second.front();
		nueva = itMap->second.size();

		list<unsigned int> listaIds;

		double aij = itMap->second.size();
		string rutahash= Parametros().getParametro(CARPETA_DATOS);
		rutahash+=NOMBRE_HASH_PALABRAS;
		Hash hash(rutahash);
		Registro* registro= hash.buscar(itMap->first);

		double ni= 1;


		if (registro!= NULL){

			offset= registro->getAtributosEnteros()->front();
			ListasIds().obtenerListaIds(offset, &listaIds);
			ni= listaIds.size();

		}

		double pesoGlobal= log10((double)N/(double)ni);
		double peso= aij*pesoGlobal;
		acumuladoNormaInf+= pow(peso,2);

		ListasIds().agregarPosPalabra(&idLista,posPal,true);
		arbolPal->insertar(clave,idLista);

		list<int>::iterator itPos = itMap->second.begin();
		itPos++; //para salir del front por que ya se cargo antes
		for ( ; itPos != itMap->second.end() ; itPos++)

		{
			posPal = *itPos;
			ListasIds().agregarPosPalabra(&idLista,posPal,false);

		}

		delete registro;
	}
	double normaInfinito= sqrt(acumuladoNormaInf);
	//cout<<normaInfinito<<endl;
	archivoNormasInf archivoNormas;
	archivoNormas.escribirNorma(normaInfinito);

	delete arbolPal;
/**********************************************borrar***************************************************/
//	list<unsigned int> *lista = new list<unsigned int>();
//	ListasIds().obtenerListaIds(1,lista);
//
//	for (list<unsigned int>::iterator it = lista->begin(); it != lista->end() ; it ++)
//		cout << *it << endl;





	/*******************AGREGADO ENTREGA II*************************/


	delete unParser;


	//agregar el libro a las listas
	SinIndice *listas = SinIndice().getInstancia();

	//ProcesadorConsultas().actualizarPesos();

	unsigned int id = unLibro->getId();

	delete unLibro;

	return listas->agregarLibroPendienteATodasLasListas(id);

	//cout << "agrego a las listas no procesadas" << endl;

}