elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


  Mostrar Temas
Páginas: [1]
1  Programación / Programación C/C++ / Modificar datos en fichero // Algo esta fallando. en: 3 Octubre 2018, 17:49 pm
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
  1. void modificarContacto(int cantidad, int auxRef) {
  2.  
  3. ifstream leerBuscar;
  4. leerBuscar.open("agenda.txt", ios::in);
  5. if (leerBuscar.fail()) {
  6. cout << "\nSe ha producido un error grave en leerBuscar (de modificarContacto).\n";
  7. }
  8.  
  9. char aux1[20], aux2[20], aux3[20];
  10. int intaux, posicion;
  11.  
  12. cout << endl;
  13. cout << "\nposicion antes de entrar en el for -- leerBuscar" << leerBuscar.tellg() << "   " << endl;
  14. for (int i = 0; i < cantidad; i++) {
  15. cout << "\nposicion en el for antes intaux-- leerBuscar" << leerBuscar.tellg() << "   " << endl;
  16. leerBuscar >> intaux;  //ref
  17. if (intaux == auxRef) {
  18. posicion = leerBuscar.tellg();
  19. }
  20. cout << "\nposicion en el for antes aux1-- leerBuscar" << leerBuscar.tellg() << "   " << endl;
  21. leerBuscar >> aux1;   //nombre
  22. cout << "\nposicion en el for antes aux2-- leerBuscar" << leerBuscar.tellg() << "   " << endl;
  23. leerBuscar >> aux2;  //ape
  24. cout << "\nposicion en el for antes aux3-- leerBuscar" << leerBuscar.tellg() << "   " << endl;
  25. leerBuscar >> aux3; //tel
  26. }
  27.  
  28. leerBuscar.seekg(posicion);
  29. leerBuscar >> aux1;
  30. leerBuscar >> aux2;
  31. leerBuscar >> aux3;
  32.  
  33. leerBuscar.close();
  34. ///ahora con la posicion, "posicionamos" al escritura.
  35. ofstream writeBuscar;
  36. writeBuscar.open("agenda.txt", ios::app);
  37. if (writeBuscar.fail()) {
  38. cout << "\nERROR GRAVE EN WRITEBUSCAR dentro de modificarcontacto\n";
  39. }
  40. writeBuscar.seekp(posicion);
  41. cout << "\ntellp de write buscar: " << writeBuscar.tellp() << endl;
  42. //aca ya estaria en la posicion deseada.
  43. char opc;
  44.  
  45.  
  46. do {
  47. cout << "\nEl nombre guardado es: " << aux1 << endl;
  48. cout << "\nDesea modificar el nombre? ";
  49. cout << " (s)   /   (n)" << endl;
  50. cout << " ----> ";
  51. cin >> opc;
  52. if ((opc == 's') || (opc == 'S')) {
  53. cout << "\ntellp de write buscar antes de modificar nombre: " << writeBuscar.tellp() << endl;
  54. cout << "\nNuevo nombre: ";
  55. cin.ignore();
  56. cin.getline(aux1, 20, '\n');
  57. writeBuscar << aux1 << '\n';
  58. cout << "\nNombre modificado con exito.\n";
  59. cout << "\ntellp de write buscar despues de modificar nombre: " << writeBuscar.tellp() << endl;
  60. }
  61. else {
  62. if ((opc != 'n') && (opc != 'N') ){
  63. cout << "\nOpcion Invalida. Ingrese 's' para SI o 'n' para NO.\n";
  64. }
  65. }
  66. } while ((opc != 'n') && (opc != 'N') && (opc != 's') && (opc != 'S'));
  67.  
  68. do {
  69. cout << "\nEl apellido guardado es: " << aux2 << endl;
  70. cout << "\nDesea modificar el apellido? ";
  71. cout << " (s)   /   (n)" << endl;
  72. cout << " ----> ";
  73. cin >> opc;
  74. if ((opc == 's') || (opc == 'S')) {
  75. cout << "\ntellp de write buscar antes de modificar ape: " << writeBuscar.tellp() << endl;
  76. cout << "\nNuevo apellido: ";
  77. cin.ignore();
  78. cin.getline(aux2, 20, '\n');
  79. writeBuscar <<aux2<<'\n';
  80. cout << "\Apellido modificado con exito.\n";
  81. cout << "\ntellp de write buscar dps de modificar ape: " << writeBuscar.tellp() << endl;
  82. }
  83. else {
  84. if ((opc != 'n') && (opc != 'N')) {
  85. cout << "\nOpcion Invalida. Ingrese 's' para SI o 'n' para NO.\n";
  86. }
  87. }
  88. } while ((opc != 'n') && (opc != 'N') && (opc != 's') && (opc != 'S'));
  89.  
  90. do {
  91. cout << "\nEl telefono guardado es: " << aux3 << endl;
  92. cout << "\nDesea modificar el telefono? ";
  93. cout << " (s)   /   (n)" << endl;
  94. cout << " ----> ";
  95. cin >> opc;
  96. if ((opc == 's') || (opc == 'S')) {
  97. cout << "\nNuevo telefono: ";
  98. cin.ignore();
  99. cin.getline(aux3, 20, '\n');
  100. writeBuscar << aux3 << '\n';
  101. cout << "\Telefono modificado con exito.\n";
  102. }
  103. else {
  104. if ((opc != 'n') && (opc != 'N')) {
  105. cout << "\nOpcion Invalida. Ingrese 's' para SI o 'n' para NO.\n";
  106. }
  107. }
  108. } while ((opc != 'n') && (opc != 'N') && (opc != 's') && (opc != 'S'));
  109.  
  110. writeBuscar.close();
  111. }
  112.  
2  Programación / Programación C/C++ / Grabar salto de linea en un fichero. en: 1 Octubre 2018, 13:54 pm
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  Programación / Programación C/C++ / Map: grabar en fichero // Map: leer desde fichero. en: 30 Septiembre 2018, 16:03 pm
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.
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines