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ú

Mensajes - gastongaston

#2
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.
#3
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();
}
#4
Lo que pasa es que te falto poner el ; despues de la linea:

scanf("%d" ,&num1)


es decir, tendria que escribirse asi:

scanf("%d" ,&num1);

#5
muchas gracias, gente!

todo perfecto ahora.
#6
Programación C/C++ / Re: problema programa c++
1 Octubre 2018, 16:46 PM
Código (cpp) [Seleccionar]



#include <iostream>

using namespace std;

int main(){
int i = 0;
int numero;
int j = 1;

do{

cout<<"\nIngrese el numero: ";
cin>>numero;
}while ( (numero < 2) || (numero > 7));

do{
while(j <= i){
cout<<j;
j++;
}
j = 1;
cout<<endl;
i++;
}while (i <= numero);


cout<<endl;
return 0;
}



[MOD] Para publicar código usar las etiquetas GeSHi

ahora que releo, veo que al final hay que hacer una pregunta.
entonces podrías hacer todo dentro de un do_while con una condicion y listo.

espero que te sirva, soy super novato en esto pero me intrigaba si podia sacarlo.
saludos.
#7
Gracias por responder.

Lo que estoy observando es que cuando abro el archivo desde mi escritorio (agenda.txt), se graba linea por linea.
Pero cuando los quiero "leer" desde mi funcion leer(), me los muestra todos juntos.

Esto tiene sentido?
O deberia hacer algo más de lo que, por supuesto, no me estoy enterando?

Muchas gracias!
#8
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.
#9
Programación C/C++ / Re: Necesito ayuda en C++.
30 Septiembre 2018, 16:08 PM
Hola!
Yo tambien soy nuevo en todo esto, hace dos meses mas o menos estoy haciendo un curso online (Programacion ATS en youtube) y cuando lo termine, voy a hacer un curso presencial en Barcelona (3 meses).

Por lo que, mi recomendacion, y aclaro que es la recomendacion de un NOVATO TOTAL, es mirarte los videos del curso del que te dije ahi arriba, ir probando y siempre apuntalar tus conocimientos con un libro (yo tengo Enciclopedia del lenguaje C++ de Javier Ceballos).

Saludos.
#10
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.