Modificar datos en fichero // Algo esta fallando.

Iniciado por gastongaston, 3 Octubre 2018, 17:49 PM

0 Miembros y 1 Visitante están viendo este tema.

gastongaston

Hola!
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 (cpp) [Seleccionar]

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();
}
Perdon por tan poco.

gastongaston

Creo que me di cuenta que lo más lógico (aunque dudo que sea lo más eficiente) sería ir leyendo y grabando en un fichero "temporal" todo lo que encuentro, hasta que se cumple la condicion y ahi, se graba en el fichero temporal lo "nuevo" y, posteriormente, se renombra.

Es posible hacer esto? es decir, borrar un archivo desde codigo de c++ y renombrar otro? (el temporal).

Saludos.
Perdon por tan poco.