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; }
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){
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; }
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; }