Estoy haciendo una agenda en donde tengo un indice que esta siempre cargado en memoria (un map) y luego la agenda propiamente dicha, grabada en un .txt.
Hasta ahi va todo bien, puedo guardar y ver todo lo que ingrese.
El problema surge cuando quiero modificar uno de estos datos.
En el .txt grabo 4 elementos:
un int, que seria el numero del indice en la agenda.
y 3 char[] (nombre, apellido y telefono).
Cuando quiero modificar registros, en vez de modificar los registros especificos, me "crea" nuevos registros al final del archivo.
Estoy totalmente perdido.
Gracias de antemano y espero que me puedan ayudar.
Saludos.
Código
void modificarContacto(int cantidad, int auxRef) { ifstream leerBuscar; leerBuscar.open("agenda.txt", ios::in); if (leerBuscar.fail()) { cout << "\nSe ha producido un error grave en leerBuscar (de modificarContacto).\n"; } char aux1[20], aux2[20], aux3[20]; int intaux, posicion; cout << endl; cout << "\nposicion antes de entrar en el for -- leerBuscar" << leerBuscar.tellg() << " " << endl; for (int i = 0; i < cantidad; i++) { cout << "\nposicion en el for antes intaux-- leerBuscar" << leerBuscar.tellg() << " " << endl; leerBuscar >> intaux; //ref if (intaux == auxRef) { posicion = leerBuscar.tellg(); } cout << "\nposicion en el for antes aux1-- leerBuscar" << leerBuscar.tellg() << " " << endl; leerBuscar >> aux1; //nombre cout << "\nposicion en el for antes aux2-- leerBuscar" << leerBuscar.tellg() << " " << endl; leerBuscar >> aux2; //ape cout << "\nposicion en el for antes aux3-- leerBuscar" << leerBuscar.tellg() << " " << endl; leerBuscar >> aux3; //tel } leerBuscar.seekg(posicion); leerBuscar >> aux1; leerBuscar >> aux2; leerBuscar >> aux3; leerBuscar.close(); ///ahora con la posicion, "posicionamos" al escritura. ofstream writeBuscar; writeBuscar.open("agenda.txt", ios::app); if (writeBuscar.fail()) { cout << "\nERROR GRAVE EN WRITEBUSCAR dentro de modificarcontacto\n"; } writeBuscar.seekp(posicion); cout << "\ntellp de write buscar: " << writeBuscar.tellp() << endl; //aca ya estaria en la posicion deseada. char opc; do { cout << "\nEl nombre guardado es: " << aux1 << endl; cout << "\nDesea modificar el nombre? "; cout << " (s) / (n)" << endl; cout << " ----> "; cin >> opc; if ((opc == 's') || (opc == 'S')) { cout << "\ntellp de write buscar antes de modificar nombre: " << writeBuscar.tellp() << endl; cout << "\nNuevo nombre: "; cin.ignore(); cin.getline(aux1, 20, '\n'); writeBuscar << aux1 << '\n'; cout << "\nNombre modificado con exito.\n"; cout << "\ntellp de write buscar despues de modificar nombre: " << writeBuscar.tellp() << endl; } else { if ((opc != 'n') && (opc != 'N') ){ cout << "\nOpcion Invalida. Ingrese 's' para SI o 'n' para NO.\n"; } } } while ((opc != 'n') && (opc != 'N') && (opc != 's') && (opc != 'S')); do { cout << "\nEl apellido guardado es: " << aux2 << endl; cout << "\nDesea modificar el apellido? "; cout << " (s) / (n)" << endl; cout << " ----> "; cin >> opc; if ((opc == 's') || (opc == 'S')) { cout << "\ntellp de write buscar antes de modificar ape: " << writeBuscar.tellp() << endl; cout << "\nNuevo apellido: "; cin.ignore(); cin.getline(aux2, 20, '\n'); writeBuscar <<aux2<<'\n'; cout << "\Apellido modificado con exito.\n"; cout << "\ntellp de write buscar dps de modificar ape: " << writeBuscar.tellp() << endl; } else { if ((opc != 'n') && (opc != 'N')) { cout << "\nOpcion Invalida. Ingrese 's' para SI o 'n' para NO.\n"; } } } while ((opc != 'n') && (opc != 'N') && (opc != 's') && (opc != 'S')); do { cout << "\nEl telefono guardado es: " << aux3 << endl; cout << "\nDesea modificar el telefono? "; cout << " (s) / (n)" << endl; cout << " ----> "; cin >> opc; if ((opc == 's') || (opc == 'S')) { cout << "\nNuevo telefono: "; cin.ignore(); cin.getline(aux3, 20, '\n'); writeBuscar << aux3 << '\n'; cout << "\Telefono modificado con exito.\n"; } else { if ((opc != 'n') && (opc != 'N')) { cout << "\nOpcion Invalida. Ingrese 's' para SI o 'n' para NO.\n"; } } } while ((opc != 'n') && (opc != 'N') && (opc != 's') && (opc != 'S')); writeBuscar.close(); }