Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - gastongaston

#1
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();
}
#2
Hola!
Les quiero hacer una consulta de novato total:
estoy grabando en un fichero ciertos datos, y quiero que para cada uno, exista un salto de linea. Pero no puedo conseguirlo.
Mi intento para que funcione es el siguiente:

void ingresar(int referencia, Persona per) {
   ofstream escritura;
   escritura.open("agenda.txt", ios::app);
   if (escritura.fail()) {
      cout << "\nError al intentar abrir ESCRITURA\n";
   }

   escritura << referencia << '\n';
   escritura << per.getNombre() << '\n';
   escritura << per.getApellido() << '\n';
       escritura.close();
}


void leer() {
   ifstream lectura;
   lectura.open("agenda.txt", ios::in);
   if (lectura.fail()) {
      cout << "\nERROR EN LECtURA DE ARCHIVO\n";
   }

   string texto;
   while (!lectura.eof()){
      getline(lectura, texto);
      cout << texto;
   }
   lectura.close();
}

Graba "bien" pero todo junto, sin espacios.
Alguna idea?

Muchas gracias.
#3
Hola!
Primero que nada saludo, porque me registre hace minutos y me anime a hacerles esta pregunta. Soy un completo novato, algo que cuando vean el codigo lo van a poder apreciar jaja!
Mi intencion es hacer un programa que cuando le ingreso un map <int,Persona> cuyos campos estan debidamente completados, el programa ingrese a una funcion y "copie" el contenido del map en un archivo.
Eso me sale. Al menos para el primer elemento, luego comienzan los errores.

Caso similar cuando quiero "leer" el contenido copiado al archivo: me sirve solo para el primer caso, despues tira errores.

El codigo es el siguiente:

void ingresar(int referencia, Persona per) {
   ofstream escritura;
   escritura.open("agenda.dat", ios::app | ios::binary);
   if (escritura.fail()) {
      cout << "\nError al intentar abrir ESCRITURA\n";
   }

   map <int, Persona> buffer;
   map <int, Persona>::iterator it;

   buffer.insert(pair <int,Persona> (referencia, per));
   it = buffer.begin();

   escritura.write((char*)&it, sizeof(buffer));
   escritura.close();

}

void leer() {
   ifstream lectura;
   lectura.open("agenda.dat", ios::in | ios::binary);
   if (lectura.fail()) {
      cout << "\nERROR EN LECtURA DE ARCHIVO\n";
   }
   map <int, Persona> buffer;
   map <int, Persona>::iterator it;

   while (!lectura.eof()) {
      if (!lectura.eof()) {
         lectura.read((char*)&it,sizeof(buffer));
         cout << "\nKey: " << it->first << endl;
      }
   }
   lectura.close();

}

desde ya, muchas gracias y espero que alguien me pueda ayudar.