Foros del Web » Programación para mayores de 30 ;) » C/C++ »

ayuda con fichero...

Estas en el tema de ayuda con fichero... en el foro de C/C++ en Foros del Web. Hola amigos! necesito de su ayuda, necesito hacer un programa que simule una pequeña agenda y la guarde en un fichero, la agenda contendrá solamente ...
  #1 (permalink)  
Antiguo 22/09/2010, 12:43
Avatar de douglasloza  
Fecha de Ingreso: abril-2008
Ubicación: Santa Tecla, El Salvador, El Salvador
Mensajes: 35
Antigüedad: 16 años
Puntos: 0
Exclamación ayuda con fichero...

Hola amigos!
necesito de su ayuda, necesito hacer un programa que simule una pequeña agenda y la guarde en un fichero, la agenda contendrá solamente el nombre y el numero de telefono utilizando estructuras, el problema esq el programa debe poder visualizar lo qe tenga el archivo de texto pero debe ser ordenado alfabeticamente... le pongo el codigo, solo necesito que me ayuden a ordenarlo de forma alfabetica...
Mil Gracias!!!

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

int main(){
int opcion;
char nombre[80], telefono[9], leer[100];
cout<<"1.- Agregar numero de telefono ";
cout<<"2.- Mostrar agenda";
cout<<"3.- Salir";
cin>>opcion;
switch (opcion){
case 1: {//agregar numeros a la agenda
cout<<"Ingrese el nombre ";
fflush(stdin);
gets(nombre);
cout<<"Ingrese el numero de telefono ";
fflush(stdin);
gets(telefono);

//utilizacion del fichero
ofstream agenda;
agenda.open("telefono.txt",ios::app);
agenda<<nombre<<' '<<telefono<<endl;
agenda.close();

//ES AQUI DONDE AL MOMENTO DE ALMACENAR UN NUEVO CONTACTO, DEBO PONERLO EN LA UBICACION
//CORRECTA PARA QUE QUEDE DE FORMA ORDENADA ALFABETICAMENTE



break;





}
case 2: //mostrar agenda
//utilizacion de fichero
ifstream lectura;
lectura.open("telefono.txt",ios::out);
while(!lectura.eof()){
lectura.getline(leer,100);
cout<<leer<<endl;
}
break;
}


system("PAUSE");
return 0;

}
  #2 (permalink)  
Antiguo 22/09/2010, 13:22
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: ayuda con fichero...

Hay algo que no tiene sentido. Tu has dicho:
Cita:
Iniciado por douglasloza Ver Mensaje
, la agenda contendrá solamente el nombre y el numero de telefono utilizando estructuras
Pero en tu codigo no has usado ninguna estructura.

Igualmente, una forma facil de hacer esto, seria a la hora de agregar uno nuevo, deberias colocarlo donde corresponde alfabeticamente.

La idea seria leer linea a linea, comparar el nombre a insertar con el leido (utilizar funcion strcmp). Si la almacenada es "menor" la guardas en un archivo temporal, y si es menor ingresas la nueva y luego todo el archivo que queda.
Por ultimo borras el archivo vieno y renombras el archivo temporal como uno nuevo.

Y listo asi agregas personas alfabeticamente.
  #3 (permalink)  
Antiguo 22/09/2010, 14:41
Avatar de douglasloza  
Fecha de Ingreso: abril-2008
Ubicación: Santa Tecla, El Salvador, El Salvador
Mensajes: 35
Antigüedad: 16 años
Puntos: 0
Respuesta: ayuda con fichero...

aa si perdon, no es estructura jeje :S

si te entiendo, pero cuando comparas con las strcmp tendrias que comparar cada cadena con lo que vas a introducir, no?
entonces primero tendria que leer todo lo que tengo en el archivo y luego ir comparando cadena por cadena? o de que forma?? ayudame .. jeje
Mil Gracias por tu pronta respuesta!! C:
  #4 (permalink)  
Antiguo 22/09/2010, 15:00
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: ayuda con fichero...

No. NO debes leer todo de una...sino leer linea a linea. Es decir lees un nombre y un telefono. Comparas con el que vas a ingresar.

Si el ultimo es menor, lo escribis en el archivo secundario. Y luego terminas de leer todo el archivo primara y lo escribis en el secundario.

En caso contrario que la cadena a ingresar fuese mayor, debes escribir los datos recien leidos en el archivo secundario y volver a leer una nueva linea.

Ahi se repite todo el proceso. Si llegas al fin del archivo y no lo ingresaste, lo escribes. Por ultimo realizas un cambia de nombre para que quede con el nombre del archivo primario y listo! Tienes tu lista ordenada.
  #5 (permalink)  
Antiguo 23/09/2010, 08:32
Avatar de douglasloza  
Fecha de Ingreso: abril-2008
Ubicación: Santa Tecla, El Salvador, El Salvador
Mensajes: 35
Antigüedad: 16 años
Puntos: 0
Respuesta: ayuda con fichero...

umm ya.. entonces tendria que utilizar un archivo de acceso aleatorio? y utilizando las funciones de fwrite y fread y fseek, cierto?
  #6 (permalink)  
Antiguo 23/09/2010, 11:25
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: ayuda con fichero...

No necesariamente! Puedes usar cualquier forma de leer y escribir en ficheros!
  #7 (permalink)  
Antiguo 27/09/2010, 12:33
Avatar de douglasloza  
Fecha de Ingreso: abril-2008
Ubicación: Santa Tecla, El Salvador, El Salvador
Mensajes: 35
Antigüedad: 16 años
Puntos: 0
Exclamación Respuesta: ayuda con fichero...

Hola! yo de nuevo... :stress:
ya tengo el programa... en teoria... es decir si me lo ubica, solo que me hace un gran desorden jeje... porq cuando me encuentra que es mayor o menor con el strcmp, ya que esta en un bucle porque esta leyendo el archivo, me borra los que son menores (todos los que son menores) y me los remplaza con la mayor (que es la nueva entrada), me ayudas, no se como hacer!
Gracias...! (adjunto codigo)
Código C++:
Ver original
  1. cout<<"Ingrese el nombre ";
  2.                 fflush(stdin);
  3.                 gets(nombre);
  4.                 cout<<"Ingrese el numero de telefono ";
  5.                 fflush(stdin);
  6.                 gets(telefono);
  7.                
  8.                 //utilizacion del fichero
  9.                 int ban=0;
  10.                 ofstream agenda;
  11.                 agenda.open("temporal.txt",ios::app);
  12.                 ifstream lectura;
  13.                          lectura.open("telefono.txt",ios::out);
  14.                          while(lectura>>nombreb>>telefonob){
  15. /*es en este fragmento donde me pasa todo ya que al estar en un bucle me reemplaza todas las menores con lo que estoy introduciendo, que hago?*/
  16.                            if (strcmp(nombreb,nombre)<0){
  17.                                                 agenda<<nombre<<' '<<telefono<<endl;
  18.                                                
  19.                                                
  20.                                                 }
  21.                            else if(strcmp(nombreb,nombre)>0){
  22.                                                 agenda<<nombreb<<' '<<telefonob<<endl;
  23.                                 }
  24.                                   }
  25.                 lectura.close();
  26.                 agenda.close();
  27.                
  28.  system("PAUSE");
  29.     return 0;
  30.    
  31. }
  #8 (permalink)  
Antiguo 27/09/2010, 12:47
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: ayuda con fichero...

Tu problema es que reemplaza a todos los mayores por el mismo. Eso pasa porque no cortas el bucle cuando encontras la posicion donde va el nombre.

Código C++:
Ver original
  1. cout<<"Ingrese el nombre ";
  2.                 fflush(stdin);
  3.                 gets(nombre);
  4.                 cout<<"Ingrese el numero de telefono ";
  5.                 fflush(stdin);
  6.                 gets(telefono);
  7.                
  8.                 //utilizacion del fichero
  9.                 int ban=0;
  10.                 ofstream agenda;
  11.                 agenda.open("temporal.txt",ios::app);
  12.                 ifstream lectura;
  13.                 lectura.open("telefono.txt",ios::out);
  14.                 ingresado = 0;
  15.                 while(lectura>>nombreb>>telefonob && ingresado == 0){
  16.                            if (strcmp(nombreb,nombre)<0){
  17.                                                 agenda<<nombreb<<' '<<telefonob<<
  18.                            }else if(strcmp(nombreb,nombre)>0){
  19.                                                 agenda<<nombre<<' '<<telefono<<endl;
  20.                                                  agenda<<nombreb<<' '<<telefonob<<endl;
  21.                                                  ingresado == 1;
  22.                             }
  23.                 }
  24.                  if (ingresado ==0)   agenda<<nombre<<' '<<telefono<<endl;
  25.                  while(lectura>>nombreb>>telefonob) agenda<<nombreb<<' '<<telefonob<<endl;
  26.                 lectura.close();
  27.                 agenda.close();
  28.                
  29.  system("PAUSE");
  30.     return 0;
  31.    
  32. }

Utilizo la variable ingresado, para llevar la cuenta si lo ingrese. Una vez ingresado, se corta el while y se procede a guarlos los que faltaron, que deberian ser todos mayores.
Se puede dar el caso que el nombre a ingresar sea el mayor de todo, en ese caso cuando se sale del while "ingresado" va a seguir siendo cero. Por lo tanto escribo el nombre.

Última edición por sam90; 27/09/2010 a las 12:54
  #9 (permalink)  
Antiguo 28/09/2010, 16:28
Avatar de douglasloza  
Fecha de Ingreso: abril-2008
Ubicación: Santa Tecla, El Salvador, El Salvador
Mensajes: 35
Antigüedad: 16 años
Puntos: 0
Respuesta: ayuda con fichero...

uuuuuuu Gracias viejo, te luciste!! sois la hostia tio!! xD
solo una pregunta mas jeje...

en el fragmento que dices
Código C++:
Ver original
  1. while(lectura>>nombreb>>telefonob) agenda<<nombreb<<' '<<telefonob<<endl;
que es el utlimo while, ahi vuelvo a leer mi fichero... oka
pero entonces, el programa sabe en que posicion me he quedado para seguir leyendo desde esa posicion... y eso es porque no he cerrado el fichero??

PD: por si a alguien mas le sirve el codigo, en la parte que dice ingreso==1, es solo un =, asi:
ingreso=1;
  #10 (permalink)  
Antiguo 28/09/2010, 17:35
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: ayuda con fichero...

SI tienes razon, se me paso!
Ese while esta para que cuando inserte el nuevo, simplemente agregue todos los restantes al final del archivo. Y exactamente el programa recuerda en que parte del archivo quedo. A menos que lo cierre. Tambien puede ser modificada esa posicion!
  #11 (permalink)  
Antiguo 30/09/2010, 10:35
Avatar de douglasloza  
Fecha de Ingreso: abril-2008
Ubicación: Santa Tecla, El Salvador, El Salvador
Mensajes: 35
Antigüedad: 16 años
Puntos: 0
Respuesta: ayuda con fichero...

Hola otra vez! umm... oe..
y si quiero borrar un contacto? como hago para borrar toda la linea donde aparece el nombre y numero de telefono?? podria sustituirlo por "" (nada) pero me quedaria siempre la linea en blanco, pero para que literalmente se borre, como le hago??
Ademas de como hacer para ponerle un nombre distinto a un fichero por ejemplo:
que el usuario introduzca su nombre, y que el fichero se llama segun el nombre del usuario.

Grax...!

Última edición por douglasloza; 30/09/2010 a las 10:56
  #12 (permalink)  
Antiguo 30/09/2010, 11:11
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: ayuda con fichero...

El tema del borrado es parecido al de ingresar. Vas leyendo uno a uno, y cuando coincide el nombre ese no lo pones en el archivo.

El tema del fichero simplemente abrilo con otro nombre.
  #13 (permalink)  
Antiguo 30/09/2010, 11:29
Avatar de douglasloza  
Fecha de Ingreso: abril-2008
Ubicación: Santa Tecla, El Salvador, El Salvador
Mensajes: 35
Antigüedad: 16 años
Puntos: 0
Respuesta: ayuda con fichero...

es cierto!!! no se me ocurrio eso de que simplemente no lo ingresas!! lo que hace el sueño
pero lo del fichero, necesito que el nombre del fichero sea como el usuario quiera, es decir:
si el usuario quiere que su fichero se llame hola, pues que asi se llame, o si quiere que se llame adios, entonces que asi se llame.. no se si me entiendes??
Gracias bro!! ^^
  #14 (permalink)  
Antiguo 30/09/2010, 12:25
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: ayuda con fichero...

Código C++:
Ver original
  1. char nombretelefono[100];
  2. gets(nombretelefono);
  3. agenda.open(nombretelefono,ios::app);

Etiquetas: c++, estructura, fichero, ordenar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:24.